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!),

【结果分析】

此时,任务只能排队,顺序执行。

 

posted @ 2016-08-19 09:34  Acode  阅读(461)  评论(0编辑  收藏  举报
您是本站第访问量位访问者!