Java多线程、主线程等待所有子线程执行完毕、共享资源
1.Java创建与启动线程
Java提供两种方式创建和启动线程:1.直接Thread类,2.实现Runable接口。
1.1 继承Thread类
public class myThread extends Thread {public void run(){for(int i=0;i<5;i++){System.out.println(this.getName()+":"+i);}}public static void main(String[] args){//创建3个线程myThread myThread1 = new myThread();myThread myThread2 = new myThread();myThread myThread3 = new myThread();//启动线程myThread1.start();myThread2.start();myThread3.start();}
}
线程1,2,3,随机执行
注意启动线程一定要用thread.start()而不能用thread.run()。否则则是顺序执行,失去多线程的意义。
public class myThread extends Thread {public void run(){for(int i=0;i<5;i++){System.out.println(this.getName()+":"+i);}}public static void main(String[] args){//创建3个线程myThread myThread1 = new myThread();myThread myThread2 = new myThread();myThread myThread3 = new myThread();//启动线程 myThread1.run();myThread2.run();myThread3.run();} }
输出结果:三个线程顺序执行
1.2 实现Runnable接口实现
public class myRunnable implements Runnable {private String name;public void run() {for(int i=0;i<5;i++){System.out.println(this.getName()+":"+i);}}public String getName() {return name;}public myRunnable(String name) {super();this.name = name;}public static void main(String[] args){//创建3个线程myRunnable myRunnable1 = new myRunnable("thread1");myRunnable myRunnable2 = new myRunnable("thread2");myRunnable myRunnable3 = new myRunnable("thread3");//启动线程,由于runnable中是没有start方法的,这里要将你的runnable实例作为Thread(Target target)参数,启动线程//多个Runnable实例,执行相同代码new Thread(myRunnable1).start();new Thread(myRunnable2).start();new Thread(myRunnable3).start();}}
执行结果:随机执行
2.两种方式有什么不同,再看下面的代码,利用Runnable 实现资源共享,这里的共享知识部分共享
比如售票系统
1 public class myThread extends Thread { 2 private int tickets=5;//总共5张票 3 public void run(){ 4 for(int i=0;i<10;i++){ 5 if(tickets>0){ 6 System.out.println(this.getName()+":"+tickets--); 7 } 8 } 9 } 10 11 public static void main(String[] args){ 12 //创建3个线程 13 myThread myThread1 = new myThread(); 14 myThread myThread2 = new myThread(); 15 myThread myThread3 = new myThread(); 16 //启动线程 17 myThread1.start(); 18 myThread2.start(); 19 myThread3.start(); 20 } 21 }
输出结果:每个线程都卖了5张票,相当于15张票
那么再来看看使用Runnable 实现三个进程共享系统中的5张票
public class myRunnable implements Runnable {private int tickets=5;public void run() {for(int i=0;i<10;i++){if(tickets>0){System.out.println(Thread.currentThread().getName()+"正在卖票:"+tickets--);}}}public static void main(String[] args){//创建3个线程myRunnable myRunnable1 = new myRunnable();//启动线程,由于runnable中是没有start方法的,这里要将你的runnable实例作为Thread(Target target)参数,启动线程//通过一个Runnable实例,创建3个线程,该三个线程共享tickets这个资源new Thread(myRunnable1,"1号窗口").start();new Thread(myRunnable1,"2号窗口").start();new Thread(myRunnable1,"3号窗口").start();}}
输出结果:三个线程共享了5张票
利用实例化一个Runnable对象,实现共享
3.大家注意了,多线程开发中,主线程和子线程是并发执行的,也就是,子线程在执行的过程中,主线程也在往下执行。这就导致了有这么一个需求不好实现。那就是,主线程需要所有子线程返回执行结果才能继续执行。同志们这个怎么实现呢?
ok,我们利用一个CountDownLatch来实现
1 public class MyRunnableReturn implements Runnable { 2 private CountDownLatch threadsSingal; 3 4 5 public MyRunnableReturn(CountDownLatch threadsSingal) { 6 super(); 7 this.threadsSingal = threadsSingal; 8 } 9 10 11 public void run() { 12 System.out.println(Thread.currentThread().getName()+"--开始"); 13 System.out.println(Thread.currentThread().getName()+"--结束"); 14 threadsSingal.countDown();//线程减1 15 } 16 17 public static void main(String [] agrs){ 18 System.out.println("Main --开始"); 19 CountDownLatch threadsSingal=new CountDownLatch(3); 20 MyRunnableReturn myRunnable=new MyRunnableReturn(threadsSingal); 21 new Thread(myRunnable,"thread1").start(); 22 new Thread(myRunnable,"thread2").start(); 23 new Thread(myRunnable,"thread3").start(); 24 try { 25 threadsSingal.await();//等待所有子线程执行完 26 } catch (InterruptedException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } 30 System.out.println("Main --结束"); 31 } 32 }
输出结果:主线程等待所有子线程执行完毕,然后在执行
4.问题又来了,现实开发中,有可能,需要不同Runnable根据不同的数据执行相同的代码,这个又如何实现呢?
这就又导致了,通过只实例化一个Runnable对象来进行共享资源的方法不可行了。我们可以通过将共享数据封装成一个对象,传给不同的Runnable线程对象。达到资源共享
转载于:https://www.cnblogs.com/xulangwei-1991/p/4023376.html
Java多线程、主线程等待所有子线程执行完毕、共享资源相关推荐
- java主线程等待所有子线程执行完毕再执行
java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用 ...
- Java主线程等待所有子线程执行完毕再执行解决办法(转)
方法一: Thread.join()方法,亲测可行,thread.join()方法 [java] view plain copy Vector<Thread> ts = new Vecto ...
- java 父线程_Java父线程(或是主线程)等待所有子线程退出的实例
导读热词 实例如下: static void testLock1(){ final AtomicInteger waitCount = new AtomicInteger(30000); final ...
- python 主程序等待 子线程_Python多线程中主线程等待所有子线程结束的方法
Python多线程中主线程等待所有子线程结束的方法 发布时间:2020-07-30 14:39:04 来源:亿速云 阅读:77 作者:小猪 这篇文章主要讲解了Python多线程中主线程等待所有子线程结 ...
- 主线程等待所有子线程结束的4种方法
目录 主线程不等待子线程全部结束 1.使用CountDownLatch 2.同步屏障CyclicBarrier 2.1.CyclicBarrier使用 2.2.CyclicBarrier复用 2.3. ...
- c#等待所有子线程执行完毕方法
当我们在使用线程中,你会发现主线结束后子线程的结果才显示出来.现在我要等待所以子线程结束,然后在显示结果,怎么做呢? 方法如下: 1.使用 ManualResetEvent,代码如下: using ...
- java等待所有子线程执行完毕再执行
前言:在工作项目中,有很多耗时处理都需要开多线程运行.简单的接口可以直接异步处理解决,但是对于一些业务逻辑复杂需要同步返回的这时候就需要用到以下三个多线程等待方法了. 1. thread.join( ...
- 主线程等待几个子线程执行完成方案
有时,为了程序的性能,我们有必要对程序中的for循环(含有sql/rpc操作)进行并发处理,要求是并发处理完之后才能继续执行主线程.现给出如下两种方案: 1. CountDownLatch Java代 ...
- java main 如何不退出_为什么java main主线程退出了子线程还能运行;golang main结束所有协程都被结束了...
最近看golang main函数结束,所有协程都被结束了 结论是这样:A不是main程的情况下,在A程里开启B程,A程执行完,A程return之后,B程不受影响,不会挂掉.所有子协程与main程同级的 ...
最新文章
- 55道常见的计算机面试题
- python语言代码片段-有用的Python代码片段
- SQLServer多实例更改默认实例
- 神经网络的分类准确率是100%到底意味着什么?
- 由浅入深:自己动手开发模板引擎——解释型模板引擎(二)
- hdu 2454 Degree Sequence of Graph G(可简单图化判定)
- 为什么任何对象都可以实现锁
- 编码引出的问题_FileReader读取GBK格式的文件
- java中launch方法,Java AppUtils.launchApp方法代码示例
- 数字图像-6空域滤波
- 2019 年总结 | 31岁,不过是另一个开始
- mac同步linux文件夹在哪里设置,Linux和Mac上的一些特殊文件将不再同步
- python 系统编程
- SynchronizedMap和ConcurrentHashMap 区别
- 【bzoj3573】 Hnoi2014—米特运输
- python爬取新浪博客_Python爬取韩寒所有新浪博客
- 计算机会考excel操作,信息技术会考EXCEL操作题.doc
- 关于IPhone无法收发短信---设置iphone短信中心号码
- css图片颜色设置为黑白
- 阿里设计师带你探讨UxD设计是什么?