安徽易企建站,网站品牌形象设计怎么做,ipv6改造 网站怎么做6,wordpress管理页面地址本文由作者收集整理所得#xff0c;作者不保证内容的正确行#xff0c;转载请标明出处。作者#xff1a;关新全Java多线程执行程序(1)1.1Thread类static Thread.currentThread返回当前正在执行的线程对象的引用。join 等待线程终止。yield 暂停当前正在执行的线程对象#…本文由作者收集整理所得作者不保证内容的正确行转载请标明出处。作者关新全Java多线程执行程序(1)1.1Thread类static Thread.currentThread返回当前正在执行的线程对象的引用。join 等待线程终止。yield 暂停当前正在执行的线程对象并执行其他线程。Demo1-1中给出的程序中主函数中创建了两个线程每个子线程第一条输出语句执行结束后放弃了执行权从而让其他线程有机会继续执行。这样就会看到子线程1和子线程2交叉输出的信息。在主线程中使用了join方法阻塞等待子线程执行结束当两个子线程将其内部的信息全部输出后主线程才将其线程线性输出。(Thread.currentThread的输出格式为[子线程名线程优先级线程组名])。最后在main函数内部需要调用内部类内部类应当为static。一般情况下内部类和内部接口都应当是static的。Demo 1-1 Thread类的用法package com.upc.upcgrid.guan.advancedJava.chapter02;public class YieldTest {public static class ThreadImpl implements Runnable{Overridepublic void run() {System.err.println(Thread.currentThread());Thread.yield();System.err.println(Thread.currentThread());}}public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(new ThreadImpl());Thread t2 new Thread(new ThreadImpl());t1.start();t2.start();t1.join();t2.join();System.err.println(Thread.currentThread());}}Demo1-1 输出结果Thread[Thread-0,5,main]Thread[Thread-1,5,main]Thread[Thread-0,5,main]Thread[Thread-1,5,main]Thread[main,5,main]1.2 Executor接口Executor可以定制创建特殊的子线程。例如在创建一系列的子线程时对子线程进行同样的配置如果需要修改或增强子线程的开启或配置只需修改Executor的实现即可。在Demo1-2中主线程通过Executor接口创建和执行一个新的线程。在Executor接口的ExecutorInterface实现中可以对所有的线程进行一些默认的配置然后启动执行这个线程。如果此时我们需要修改这个系列线程的优先级只需要修改ExecutorInterface接口中的相应值即可无需修改代码中的所有创建线程的地方。(有时可以在Executor的executor的方法实现中使用一定的线程调度策略这样可以为线程调度提供灵活性当修改线程调度的实现时不影响外部使用的代码)。Demo1-3实现了一个线程优先队列的Executor在这样的Executor中每次提交的任务会被放入一个队列中Executor最多只开启一个线程执行这个队列中的任务而且队列使用优先级策略就是优先级高的线程将会先被Executor执行优先级低的线程将需等待优先级高的线程执行结束后才能获得执行权。从代码中看出创建了5个线程设置了不同的优先级并提交个Executor去执行。从执行结果可以看出线程基本是按照线程优先级次序执行的(线程优先级5先执行因为在他提交的时候队列中并没有其他线程他的优先级最高因此它被最先执行了也就是说这个优先级还与线程的提交次序有关)。Executor更倾向于开启一个线程在稍后对ExecutorFactory介绍时可以看出他们一个是执行线程一个是创建线程。Demo 1-2Executor接口的使用package com.upc.upcgrid.guan.SpecialUse.chapter01;import java.lang.Thread.UncaughtExceptionHandler;import java.util.concurrent.Executor;public class ExecutorInterface implements Executor{Overridepublic void execute(Runnable command) {Thread t new Thread(command);t.setDaemon(false);t.setPriority(6);t.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {Overridepublic void uncaughtException(Thread t, Throwable e){System.err.println(e.getMessage());}});t.start();}private static class RunnableImpl implements Runnable{Overridepublic void run() {System.err.println(Thread.currentThread());}}public static void main(String[] args) throws InterruptedException {ExecutorInterface e new ExecutorInterface();e.execute(new RunnableImpl());e.execute(new RunnableImpl());}}Demo1-3 线程池的初探package com.upc.upcgrid.guan.SpecialUse.chapter01;import java.util.concurrent.BlockingQueue;import java.util.concurrent.Executor;import java.util.concurrent.PriorityBlockingQueue;public class ExecutorInterfaceWithScheduleimplements Executor{private BlockingQueuequeue new PriorityBlockingQueue();private Thread t;public ExecutorInterfaceWithSchedule() {Thread inner new Thread(new Runnable() {Overridepublic void run() {try {while(true){t new Thread(queue.take());t.start();t.join();//等待线程结束}} catch (InterruptedException e) {}}});inner.setDaemon(true);inner.start();}Overridepublic void execute(Runnable command) {try {queue.put(command);} catch (InterruptedException e) {}}private static class ThreadImpl implements Runnable,Comparable{public int priority;public ThreadImpl(int priority) {this.priority priority;}Overridepublic void run() {System.err.println(Thread.currentThread() String.valueOf(priority));}Overridepublic int compareTo(ThreadImpl o) {return o.priority priority?1:0;}}public static void main(String[] args) throws InterruptedException {ThreadImpl t1 new ThreadImpl(5);ThreadImpl t2 new ThreadImpl(6);ThreadImpl t3 new ThreadImpl(7);ThreadImpl t4 new ThreadImpl(1);ThreadImpl t5 new ThreadImpl(4);ExecutorInterfaceWithSchedule executor new ExecutorInterfaceWithSchedule();executor.execute(t1);executor.execute(t2);executor.execute(t3);executor.execute(t4);executor.execute(t5);Thread.sleep(10000);}}Demo1-3执行结果Thread[Thread-1,5,main]5Thread[Thread-2,5,main]7Thread[Thread-3,5,main]6Thread[Thread-4,5,main]4Thread[Thread-5,5,main]1Graphic 1-1与Executor有关的接口1.3ExecutorService接口ExecutorService接口用于管理Executor接口用于跟踪一个和多个异步任务的执行。简单的说就是提供一个线程池的功能可以向线程池中提交多个任务线程池根据具体的实现采用一定的调度方法和策略对提交的线程进行排队和执行。ExecutorService提供了shutDown方法可以终止线程池继续接受新的任务使用shutDown方法并不会立即取消正在执行的任务他会在线程任务执行结束后自动关闭并释放线程资源。shutDownNow方法则不同线程池会尝试试图关闭正在执行的线程。Submit扩展了Executor接口的executor方法并返回一个Future用来取消或查询线程任务。invokeAll和invokeAny方法是批量执行任务的常见形式。invokeAll是等待所有任务结束才返回而invokeAny是其中有一个任务完成就返回。一般通过Executors类的静态函数来创建相应的ExecutorService实例。Demo 1-4中主线程先创建了十个任务然后将这十个任务的集合提交给线程池执行线程池的大小是3线程池根据内部的调度策略去调度执行任务从最终的输出可以看出线程池的子线程1执行的任务最多。最终在主线程中进行结果统计关闭线程池。需要注意的是线程池的关闭需要手动代码而且还要给出出错的情况下如何合理的终结线程池。Demo 1-4 线程池的使用package com.upc.upcgrid.guan.SpecialUse.chapter01;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.TimeUnit;public class ExecuteServiceInterface {public static final int THREAD_SIZE 10;private static class onceCompute implements Callable{private int start;private int end;public onceCompute(int start,int end) {this.start start;this.end end;}Overridepublic Integer call() throws Exception {int sum 0;for(int i start ; i end ; i){sum i;}System.err.println(Thread.currentThread());return sum;}}public static void main(String[] args) throws InterruptedException, ExecutionException{ExecutorService pool Executors.newFixedThreadPool(3);//创建3个线程的线程池Listcalls new ArrayList();//任务集合for(int i 0 ; i THREAD_SIZE ;i)//创建任务{calls.add(new onceCompute(i*100, (i1)*100));}Listfutures pool.invokeAll(calls);//阻塞等待任务完成int sum 0;for(Future f :futures)//汇总任务计算结果{sum f.get();}System.out.println(sum);//输出结果//线程池的关闭策略pool.shutdown();try {pool.awaitTermination(1000, TimeUnit.MILLISECONDS);} catch (InterruptedException e) {pool.shutdownNow();Thread.currentThread().interrupt();}}}Demo 1-4 的执行结果Thread[pool-1-thread-1,5,main]Thread[pool-1-thread-1,5,main]Thread[pool-1-thread-1,5,main]Thread[pool-1-thread-1,5,main]Thread[pool-1-thread-2,5,main]Thread[pool-1-thread-3,5,main]Thread[pool-1-thread-2,5,main]Thread[pool-1-thread-1,5,main]Thread[pool-1-thread-2,5,main]Thread[pool-1-thread-3,5,main]4995001.4ScheduleExecutorService从Graphic1-1可以看出ScheduleExecutorService是继承于ExecutorService的一个增强的接口。这个接口在ExecutorService接口的基础上增加了四个操作可以分为三种类型一种类型是schedule函数用于在指定延时后创建一个线程执行某项任务一种是scheduleAtFixedRate在指定延时后创建一个周期性执行的线程任务还有一种是scheduleWithFixedDelay在指定延时后以一定的延时执行线程任务。第二和第三种的区别在于第二种计算的是周期这个时间间隔是指定好的。第三种是延时是指从一次执行结束到下一次执行开始的这段时间这种方式将线程执行的时间也考虑在内。Demo 1-5 给出了这个示例每个1s中输出当前时间。Demo1-5 定期任务package com.upc.upcgrid.guan.SpecialUse.chapter01;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class ScheduleExecutorServiceInterface {public static void main(String[] args) throws InterruptedException {ScheduledExecutorServicepool Executors.newSingleThreadScheduledExecutor();pool.scheduleAtFixedRate(new Runnable() {DateFormat df new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);Overridepublic void run() {System.err.println(df.format(new Date()));}}, 1000,1000,TimeUnit.MILLISECONDS);Thread.sleep(10000);pool.shutdownNow();}}1.5ThreadFactory接口这个接口用于创建一个新的线程它与Executor接口的区别在于Executor接口更强调的是执行和管理一个线程而ThreadFactory强调的是如何创建一个线程。在很多的Executor实现中需要提供一个ThreadFactory实例毕竟Executor类中使用new方法创建一个线程是不合理的因为如果用户对新线程的配置进行更改这种更改将会被延伸到Executor接口的所有实现子类这不利于代码的扩展。ThreadFactory仅有一个方法newThread实现这个方法用于创建自己的线程逻辑。Demo1-6中ThreadFactory用来指定创建多线程的方式定制多线程的创建方法而Executor则更强调如何执行如何管理多线程。所以在Executor类中应当有一个ThreadFactory引用这样在Executor类中就无需显示使用new并且负责与线程相关的配置当需要对线程的属性进行配置时不会影响到Executor的内部实现。ThreadFactory主要使用的是设计模式中的工厂方法模式可以参考设计模式的相应章节。Demo1-6ThreadFactory与Executor的关系package com.upc.upcgrid.guan.SpecialUse.chapter01;import java.util.concurrent.Executor;import java.util.concurrent.ThreadFactory;public class ThreadFactoryInterface {private static class ExecutorImp implements Executor{private static ThreadFactory threadFactory;SuppressWarnings(unused)public ExecutorImp() {threadFactory new ThreadFactory() {Overridepublic Thread newThread(Runnable r) {return new Thread(r);}};}SuppressWarnings(static-access)public ExecutorImp(ThreadFactory tf){this.threadFactory tf;}Overridepublic void execute(Runnable command) {Thread t threadFactory.newThread(command);t.start();}}private static class ThreadFacotoryImp implements ThreadFactory{Overridepublic Thread newThread(Runnable r) {Thread t new Thread(r);t.setDaemon(false);t.setPriority(7);return t;}}public static void main(String[] args) {Executor executor new ExecutorImp(new ThreadFacotoryImp());executor.execute(new Runnable() {Overridepublic void run() {System.out.println(Thread.currentThread());}});}}