Java多线程编程(一)
1、Java创建多线程的方法一:(1)实现Runnable接口并实现其中的run()方法;(2)将Runable对象提交给一个Thread构造器,调用start()方法。
【程序实例】单线程
1 public class LiftOff implements Runnable { 2 3 protected int countDown = 10; 4 5 private static int taskCount = 0; 6 7 private final int id = taskCount++; 8 9 public LiftOff() { 10 } 11 12 public LiftOff(int countDown) { 13 this.countDown = countDown; 14 } 15 16 public String status() { 17 return "#" + id + "(" + (countDown > 0 ? countDown : "LiftOff!") + "),"; 18 } 19 20 @Override 21 public void run() { 22 while (countDown-- > 0) { 23 System.out.print(status()); 24 Thread.yield(); 25 } 26 } 27 28 }
1 public class Main { 2 3 public static void main(String[] args){ 4 Thread thread = new Thread(new LiftOff()); 5 thread.start(); 6 System.out.println("Waiting for LiftOff"); 7 } 8 9 }
【运行结果】
【结果分析】
主函数中,主线程(main线程)只创建了一个线程,可以看到输出结果是有序的、可控。此外,可以看出main线程并不会等待创建的线程。
【程序实例2】多线程
1 public class Main { 2 3 public static void main(String[] args) { 4 for (int i = 0; i < 5; i++) 5 new Thread(new LiftOff()).start(); 6 System.out.println("Waiting for LiftOff"); 7 } 8 9 }
【运行结果】
【结果分析】
此时主线程main线程创建并执行了5个线程,各个线程间是独立运行,输出的结果不可控。
2、执行器Executor
Java SE5的java.util.concurrent包中的执行器(Executor)将为你管理Thread对象,从而简化了并发编程。Executor 在客户端和执行任务之间提供了一个间接层,Executor代替客户端执行任务。Executor允许你管理异步任务的执行,而无须显式地管理线程的生命周期。Executor在Java SE5/6中时启动任务的优选方法。Executor引入了一些功能类来管理和使用线程Thread,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。
【程序实例3】不固定大小线程池
1 public class Main { 2 3 public static void main(String[] args) { 4 ExecutorService exec = Executors.newCachedThreadPool(); 5 for(int i=0;i<5;i++) 6 exec.execute(new LiftOff()); 7 exec.shutdown(); 8 } 9 10 }
【程序实例4】固定大小线程池
1 public class Main { 2 3 public static void main(String[] args) { 4 ExecutorService exec = Executors.newFixedThreadPool(5); 5 for (int i = 0; i < 5; i++) 6 exec.execute(new LiftOff()); 7 exec.shutdown(); 8 } 9 10 }
【程序分析】
实例3中,会根据实际的需要(5个线程)在线程池中创建相应数目的线程;实例4中,在一开始就固定了线程池的大小(5个),如果线程池中的线程的数目小于需求,则需要等待其它线程执行完后,复用线程,如实例5所示。
【程序实例5】
1 public class Main { 2 3 public static void main(String[] args) { 4 ExecutorService exec = Executors.newFixedThreadPool(3); 5 for (int i = 0; i < 5; i++) 6 exec.execute(new LiftOff()); 7 exec.shutdown(); 8 } 9 10 }
【运行结果】
1 #1(9),#0(9),#2(9),#0(8),#2(8),#1(8),#2(7),#0(7),#0(6),#0(5),#0(4),#1(7),#2(6),#0(3),#2(5),#1(6),#1(5),#1(4),#2(4),#2(3),#0(2),#2(2),#2(1),#1(3),#1(2),#1(1),#2(LiftOff!),#0(1),#0(LiftOff!),#3(9),#3(8),#1(LiftOff!),#3(7),#3(6),#4(9),#4(8),#4(7),#3(5),#4(6),#4(5),#4(4),#3(4),#3(3),#3(2),#4(3),#4(2),#3(1),#3(LiftOff!),#4(1),#4(LiftOff!),
【结果分析】
可以看出,最新运行的有3个线程(#0,#1,#2),只有当3个线程都运行完毕之后,才开始运行线程#3和#4。
【程序实例6】单线程
1 public class Main { 2 3 public static void main(String[] args) { 4 ExecutorService exec = Executors.newSingleThreadExecutor(); 5 for (int i = 0; i < 5; i++) 6 exec.execute(new LiftOff()); 7 exec.shutdown(); 8 } 9 10 }
【运行结果】
#0(9),#0(8),#0(7),#0(6),#0(5),#0(4),#0(3),#0(2),#0(1),#0(LiftOff!),#1(9),#1(8),#1(7),#1(6),#1(5),#1(4),#1(3),#1(2),#1(1),#1(LiftOff!),#2(9),#2(8),#2(7),#2(6),#2(5),#2(4),#2(3),#2(2),#2(1),#2(LiftOff!),#3(9),#3(8),#3(7),#3(6),#3(5),#3(4),#3(3),#3(2),#3(1),#3(LiftOff!),#4(9),#4(8),#4(7),#4(6),#4(5),#4(4),#4(3),#4(2),#4(1),#4(LiftOff!),
【结果分析】
此时,任务只能排队,顺序执行。
作者: Acode
出处: http://www.cnblogs.com/acode/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可留言咨询.