博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
join、volatile、newSingleThreadLatch 实现线程顺序执行
阅读量:6529 次
发布时间:2019-06-24

本文共 2725 字,大约阅读时间需要 9 分钟。

1、join

阻塞当前线程、执行调用线程。

public static void main(String[] args) throws InterruptedException {		Thread thread_1;		Thread thread_2;		Thread thread_3;				thread_1=new Thread(()->{			System.out.println(Thread.currentThread().getName()+":1"); 		});				thread_2=new Thread(()->{			try {				thread_1.join();			} catch (InterruptedException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}			System.out.println(Thread.currentThread().getName()+":2"); 		});				thread_3=new Thread(()->{			try {				thread_2.join();			} catch (InterruptedException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}			System.out.println(Thread.currentThread().getName()+":3");		});				System.out.println("线程启动");		Thread.sleep(500);		thread_1.start();		thread_2.start();		thread_3.start();			}复制代码

2、volatile

性质:

  • 可见性
  • 原子性
  • 禁止指令重排序。

保证线程同步,volatile本身线程不安全,是因为在写入主内存,其他线程可能读取主内存 ,导致读出有误。结合volatile适合的使用场景,可以使用。

  • 对变量的写操作不依赖于当前值。(大白话:修改后的变量值与当前值无关)
  • 该变量没有包含在具有其他变量的不变式中。(大白话:尽量volatile变量不影响其他变量)
static volatile int flag=0;		public static void main(String[] args) throws InterruptedException {				Thread thread_1=new Thread(()->{			while(true){				if(flag==1){					System.out.println(Thread.currentThread().getName()+":1");					flag++;					break;				}			}		});				Thread thread_2=new Thread(()->{			while(true){				if(flag==2){					System.out.println(Thread.currentThread().getName()+":2");					flag++;					break;				}			}		});				Thread thread_3=new Thread(()->{			while(true){				if(flag==3){					System.out.println(Thread.currentThread().getName()+":3");					flag++;					break;				}			}		});				thread_1.start();		thread_2.start();		thread_3.start();		System.out.println("线程启动");		Thread.sleep(1000);		flag=1;					}复制代码

3、newSingleThreadLatch

线程池,按顺序执行,内部有ThreadPoolExecutor实现一个主线程的线程池

public static ExecutorService newSingleThreadExecutor() {        return new FinalizableDelegatedExecutorService            (new ThreadPoolExecutor(1, 1,                                    0L, TimeUnit.MILLISECONDS,                                    new LinkedBlockingQueue
())); }复制代码
public static void main(String[] args) throws InterruptedException {		Thread thread_1;		Thread thread_2;		Thread thread_3;				thread_1=new Thread(()->{			System.out.println(Thread.currentThread().getName()+":1"); 		});				thread_2=new Thread(()->{			System.out.println(Thread.currentThread().getName()+":2"); 		});				thread_3=new Thread(()->{			System.out.println(Thread.currentThread().getName()+":3");		});				ExecutorService exe=Executors.newSingleThreadExecutor();		exe.submit(thread_1);		exe.submit(thread_2);		exe.submit(thread_3);		exe.shutdown();	}复制代码

其他

想使用同步线程,CountDownLatch线程实现,但好像只有当countDown()到0才能启动。不对的地方,也希望大家指正。

转载地址:http://yzxbo.baihongyu.com/

你可能感兴趣的文章
CentOS 7 关闭启动防火墙
查看>>
Vue-选项卡切换
查看>>
linux网络命令
查看>>
nodejs ejs 请求路径和静态资源文件路径
查看>>
C++小代码
查看>>
记一次思维转变的时刻
查看>>
STL - Map - 运行期自定义排序
查看>>
Oil Deposits
查看>>
poj3984 迷宫问题(简单搜索+记录路径)
查看>>
Linux 服务器buff/cache清理
查看>>
算法试题 及其他知识点
查看>>
php课程---Json格式规范需要注意的小细节
查看>>
hadoop hdfs notes
查看>>
Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
查看>>
(2编写网络)自己动手,编写神经网络程序,解决Mnist问题,并网络化部署
查看>>
【转】如何使用分区助手完美迁移系统到SSD固态硬盘?
查看>>
NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
查看>>
ios兼容iphonex刘海屏解决方案
查看>>
就是要你懂TCP -- 握手和挥手
查看>>
Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection
查看>>