首页 > 编程语言 > 详细

JAVA创建多线程的四种方法

时间:2021-01-23 10:11:16      阅读:35      评论:0      收藏:0      [点我收藏+]

1.继承Thread类,重写run()方法

    创建一个类并继承Thread类,然后重写Thread类的run()方法,创建一个新的对象,并用start()开启进入就绪状态。

    例子:创建两个线程,两个线程的功能分别为输出100以内的偶数和奇数,代码如下:

 1 public class ThreadTest extends Thread{
 2     public static void main(String[] args) {
       //采用匿名内部类创建对象
3 new Thread(){ 4 @Override 5 public void run() { 6 for (int i = 1; i <=100; i++) { 7 if (i % 2 ==0) { 8 System.out.println(Thread.currentThread().getName()+":"+i); 9 } 10 } 11 //yield();-->释放当前cpu的执行权 12 } 13 }.start(); 14 15 new Thread(){ 16 @Override 17 public void run() { 18 for (int i = 1; i <=100; i++) { 19 if (i % 2 !=0) { 20 System.out.println(Thread.currentThread().getName()+":"+i); 21 } 22 } 23 } 24 }.start(); 25 26 27 } 28 }

 

2.实现Runnable接口,重写run()方法

   创建一个类实现Runnable接口,仍然需要使用Thread类

   例子:三个窗口卖10张票,三个窗口相当于三个线程

 1 class HelloThread implements Runnable{
 2     private int ticket=10;
 3     @Override
 4     public void run() {
 5         while (true){
 6             if (ticket>0) {
 7                 System.out.println(Thread.currentThread().getName()+":卖票,票号:"+ticket);
 8                 ticket--;
 9             }else{
10                 break;
11             }
12         }
13     }
14 }
15 
16 public class ThreadTest1 {
17     public static void main(String[] args) {
18         HelloThread helloThread = new HelloThread();
19         Thread t1 = new Thread(helloThread);
20         Thread t2 = new Thread(helloThread);
21         Thread t3 = new Thread(helloThread);//三个线程公用一个对象,所以共享10张票,但未解决重票问题
22         t1.setName("窗口1:");
23         t2.setName("窗口2:");
24         t3.setName("窗口3:");
25         t1.start();
26         t2.start();
27         t3.start();
28     }
29 }

3.实现Callable接口

   创建一个实现Callable接口的类,实现call()方法;用实现Callable接口创建多线程比Runnable接口的好处是Callable接口的call()方法有返回值,call()可以抛出异常,被外操作捕获获取异常信息,Callable支持泛型。

例子:得到1到100之内偶数之和sum

 1 import java.util.concurrent.Callable;
 2 import java.util.concurrent.ExecutionException;
 3 import java.util.concurrent.FutureTask;
 4 
 5 class NewThread implements Callable{
 6 
 7     @Override
 8     public Object call() throws Exception {
 9         int sum=0;
10         for (int i = 1; i <=100 ; i++) {
11             if(i%2==0){
12                 System.out.println(i);
13                 sum+=i;
14             }
15         }
16         return sum;
17     }
18 }
19 public class ThreadNew {
20     public static void main(String[] args) {
21         NewThread newThread=new NewThread();
22         //需要创建FutureTask类对象
23         FutureTask futureTask = new FutureTask(newThread);
24         //仍然需要Thread来开启线程
25         new Thread(futureTask).start();
26         try {
27             //调用get方法得到返回值
28             Object sum = futureTask.get();
29             System.out.println("总和为:"+sum);
30         } catch (InterruptedException e) {
31             e.printStackTrace();
32         } catch (ExecutionException e) {
33             e.printStackTrace();
34         }
35     }
36 }

4.通过线程池创建多线程

   线程池用到了两个API:ExecutorService和Executors;Executor类提供了一系列工程方法用于创建线程池,返回的线程池实现了ExecutorService接口

 1 //创建一个实现Runnable接口的类ThreadMy
 2 class ThreadMy implements Runnable{
 3 
 4     @Override
 5     public void run() {
 6         for (int i = 0; i <20 ; i++) {
 7             System.out.println(Thread.currentThread().getName()+":"+i);
 8         }
 9     }
10 }
11 //创建一个实现Runnable接口的类ThreadMy1
12 class ThreadMy1 implements Runnable{
13 
14     @Override
15     public void run() {
16         for (int i = 0; i <50 ; i++) {
17             System.out.println(Thread.currentThread().getName()+":"+i);
18         }
19     }
20 }
21 public class ThreadPool {
22     public static void main(String[] args) {
23         //创建线程池,固定容量为10
24         ExecutorService service = Executors.newFixedThreadPool(10);
25         //执行任务,execute()里需要接收一个实现Runnable接口的类
26         service.execute(new ThreadMy());
27         service.execute(new ThreadMy1());
28         //关闭service,停止接受任何新任务并等待已提交的任务完成
29         service.shutdown();
30     }
31 }

 

JAVA创建多线程的四种方法

原文:https://www.cnblogs.com/sj-cxy/p/14315883.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!