Java实现多线程--四种方法

  1 /**
  2  * 第一种
  3  * 继承thread类 重写 run方法
  4  * 调用start方法,启动线程
  5  * @author sunshine
  6  */
  7 
  8 /**
  9  * 第二种实现runnable接口,重写run方法
 10  * 接口实现类的实例作为target参数,传入带参的构造方法,调用start方法启动线程
 11  * @author sunshine
 12  */
 13 
 14 /**
 15  * 第三种通过Callable和FutureTask实现线程
 16  * 1:创建Callable类的实现类,实现call方法
 17  * 2:创建Callable实现类的实现,用FutureTask来包装实现的对象
 18  * 3:将FutureTask对象作为target参数传递给Thread构造方法
 19  * 4:调用start方法,启动线程
 20  * @author sunshine
 21  */
 22 
 23 /**
 24  * 第四种--通过线程池
 25  * ExecutorService是Java中对线程池定义的一个接口
 26  * 1:创建类,实现runnbale接口
 27  * 2:设置线程数量
 28  * 3:根据线程数量创建线程执行器
 29  * 4:执行器,执行线程
 30  * 5:关闭线程池
 31  * 
 32  * 这个方法和直接实现Runable比
 33  * 这个方法 实现Runable接口
 34  * 然后实例化对象,将参数传递给线程执行器,进行执行
 35  * @author sunshine
 36  */
 37 
 38 ------------------第一种:通过继承Thread类---------
 39 package com.www.thread;
 40 
 41 /**
 42  * 第一种
 43  * 继承thread类 重写 run方法
 44  * 调用start方法,启动线程
 45  * @author sunshine
 46  */
 47 public class Thread1ByExtendsThread extends Thread{
 48     
 49     //重写run方法
 50     public void run(){
 51         //在这里 获取当前线程的名字
 52         System.out.println(Thread.currentThread().getName());
 53     }
 54     
 55     public  static void  main(String[]  args){
 56         Thread1ByExtendsThread thread1 = new Thread1ByExtendsThread();
 57         thread1.setName("线程1--通过实现Thread类");
 58         //启动线程
 59         thread1.start();
 60         System.out.println(Thread.currentThread().toString());
 61     }
 62 }
 63 
 64 
 65 
 66        ------------------第二种:通过实现Runnablle接口---------
 67 package com.www.thread;
 68 
 69 /**
 70  * 第二种实现runnable接口,重写run方法
 71  * 接口实现类的实例作为target参数,传入带参的构造方法,调用start方法启动线程
 72  * @author sunshine
 73  */
 74 public class Thread2ByImplRunable{
 75   public static void main(String[]  args){
 76     Thread t = new Thread(new MyThread());
 77     t.start();
 78   }
 79 }
 80 
 81 class MyThread implements Runnable{
 82   @Override
 83   public void run() {
 84     System.out.println("通过实现Runnbale接口创建的线程"+Thread.currentThread().getName());
 85   }
 86 }
 87 
 88 
 89 
 90 
 91        ------------------第三种:通过实现CallAble接口和FutureTask包装器---------
 92 package com.www.thread;
 93 
 94 import java.util.concurrent.Callable;
 95 import java.util.concurrent.FutureTask;
 96 
 97 /**
 98  * 第三种通过Callable和FutureTask实现线程
 99  * 1:创建Callable类的实现类,实现call方法
100  * 2:创建Callable实现类的实现,用FutureTask来包装实现的对象
101  * 3:将FutureTask对象作为target参数传递给Thread构造方法
102  * 4:调用start方法,启动线程
103  * @author sunshine
104  */
105 public class Thread3ByCallableAndFutureTask {
106  public static void main(String[]  args){
107   Callable<Object> callAble = new CallImpl<Object>();
108   FutureTask<Object> task = new FutureTask<Object>(callAble);
109   Thread t = new Thread(task);
110   System.out.println(Thread.currentThread().getName());
111   t.start();
112   }
113 }
114 
115 class CallImpl<Object> implements Callable<Object>{
116   @Override
117   public Object call() throws Exception {
118   System.err.println(Thread.currentThread().getName()+"我是通过实现callable" +
119   "接口通过FutureTask包装器来实现线程");
120   return null;
121   }
122 }
123 
124 
125 
126 
127 
128        ------------------第四种:通过线程池---------
129 package com.www.thread;
130 
131 import java.util.concurrent.Executor;
132 import java.util.concurrent.ExecutorService;
133 import java.util.concurrent.Executors;
134 
135 /**
136  * 第四种--通过线程池
137  * ExecutorService是Java中对线程池定义的一个接口
138  * 1:创建类,实现runnbale接口
139  * 2:设置线程数量
140  * 3:根据线程数量创建线程执行器
141  * 4:执行器,执行线程
142  * 5:关闭线程池
143  * 
144  * 这个方法和直接实现Runable比
145  * 这个方法 实现Runable接口
146  * 然后实例化对象,将参数传递给线程执行器,进行执行
147  * @author sunshine
148  */
149 public class Thread4ByThreadPool {
150     public static  int POOL_NUM = 5;//定义最大线程数为5
151     public static void main(String[]  args){
152         ExecutorService service = Executors.newFixedThreadPool(POOL_NUM);
153         for(int i = 0; i<POOL_NUM; i++){
154             MyThread4 thread = new MyThread4();
155             service.execute(thread);
156         }
157         service.shutdown();
158     }
159 }
160 
161 class MyThread4 implements Runnable{
162     @Override
163     public void run() {
164         System.out.println("通过线程池创建的线程"+Thread.currentThread().getName());
165     }
166     
167 }
168 
169 


 

posted on 2018-09-21 14:05  爪哇玛咖  阅读(281)  评论(0编辑  收藏  举报

导航