如何控制Java中的线程,总结了3种方法...
问题:利用Java多线程,轮流打印数字,也就是怎么控制线程....
1:通过synchronized的关键字,对类的static final 成员进行Lock,锁住对象,来实现同步。
private int id;
private static int n = 0;
private static final ThreadTest lock = new ThreadTest(); public ThreadTest(int id) {
this.id = id;
}
public ThreadTest () { }
@Override
public void run() {
while (n < 100) {
synchronized (lock) {
while ((n % 5 == 0) && (n / 5) % 5 != id) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (n < 100) {
System.out.print("Thread-" + (id+1) + " : " + " " + (n + 1)
+ " " + (n + 2) + " " + (n + 3) + " " + (n + 4)
+ " " + (n + 5) + "\n");
n += 5;
}
lock.notifyAll();
}
}
}
2.通过AtomicInteger对象,和ExecutorService实现线程之间的同步
private AtomicInteger atomicInteger=new AtomicInteger(0);
private static final int max=20; class Thread1 implements Runnable{
private int mark=0;
public Thread1(int i){
this.mark=i;
}
public void run() {
while(atomicInteger.get()<max){
if(atomicInteger.get()%5==mark){
System.out.println("线程Thread"+(mark+1)+"打印:"+(atomicInteger.get()*5+1)+" "
+(atomicInteger.get()*5+2)+" "+(atomicInteger.get()*5+3)+" "
+(atomicInteger.get()*5+4)+" "+(atomicInteger.get()*5+5));
atomicInteger.getAndIncrement();
}
}
}
}
3.通过ReentrantLock对象和Condition对象实现线程之间的同步
private int state = 1;
private int n = 1;
private ReentrantLock lock=new ReentrantLock();
private Condition condition1=lock.newCondition();
private Condition condition2=lock.newCondition();
private Condition condition3=lock.newCondition();
@Override
public void run(){
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 5; i++) {
try {
lock.lock();
while(state!=1)
try{
condition1.await();
}
catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.print(Thread.currentThread().getName()+": ");
for (int j = 0; j < 5; j++) {
System.out.print(n+++" ");
}
System.out.println();
state=2;
condition2.signal();
} finally{
lock.unlock();
}
}
}
},"线程1").start(); new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 5; i++) {
try{
lock.lock();
while(state!=2)
try {
condition2.await();
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.print(Thread.currentThread().getName()+": ");
for (int j = 0; j < 5; j++) {
System.out.print(n+++" ");
}
System.out.println();
state=3;
condition3.signal();
}
finally{
lock.unlock();
}
}
}
},"线程2").start(); new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 5; i++) {
try{
lock.lock();
while(state!=3)
try {
condition3.await();
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.print(Thread.currentThread().getName()+": ");
for (int j = 0; j < 5; j++) {
System.out.print(n+++" ");
}
System.out.println();
state=1;
condition1.signal();
}finally{
lock.unlock();
}
}
}
},"线程3").start();
}
如何控制Java中的线程,总结了3种方法...的更多相关文章
- JAVA中创建线程池的五种方法及比较
之前写过JAVA中创建线程的三种方法及比较.这次来说说线程池. JAVA中创建线程池主要有两类方法,一类是通过Executors工厂类提供的方法,该类提供了4种不同的线程池可供使用.另一类是通过Thr ...
- Java中实现线程同步的三种方法
实现同步的三种方法 多线程共享数据时,会发生线程不安全的情况,多线程共享数据必须同步. 实现同步的三种方法: 使用同步代码块 使用同步方法 使用互斥锁ReetrantLock(更灵活的代码控制) 代码 ...
- Java中获取键盘输入值的三种方法
Java中获取键盘输入值的三种方法 Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...
- AE控制图层中要素可见状态的几种方法
转自原文 AE控制图层中要素可见状态的几种方法 工作中常有这样的需求,一个作业图层由几个作业员来操作,我们要 控制每一个作业员只能看到他负责的区域.作业员的可见区域控制有时候是按空间区域划分,有时候是 ...
- java 中创建线程有哪几种方式?
Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行 ...
- Java中实现线程通信的三个方法的作用是什么?
Java提供了3个方法解决线程之间的通信问题,均是java.lang.Object类的方法,都只能在同步方法或者同步代码块中使用,否则会抛出异常. 方法名 作 用 final void wait() ...
- java中调用dll文件的两种方法
一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676 JNativ ...
- Java中遍历Map集合的四种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- Java入门:Java中获取键盘输入值的三种方法
Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代 ...
- Java中遍历Map对象的4种方法
java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHashMap, Hashtable, 等等). HashMap<Inte ...
随机推荐
- 为什么学习c++?该怎么学?
本人最近刚开始学习C++,准备记录下学习C++的历程.以下都是记录欢迎指教. 第一堂课,我们的老师告诉我们为什么学习C++,学习C++有啥用?这我也想了.但是我不了解C++,所以肯定是想不了多少的. ...
- php调用c/c++的一种方式
php调用c/c++有很多方式,最常用的是通过tcp或者http去调用,通过发送请求去调用c/c++编写的cgi/fastcgi来实现,另外php还有一种直接执行外部应用程序的方式,这种方式会影响到系 ...
- [转] git fetch与pull
原文: http://www.tech126.com/git-fetch-pull/ Git中从远程的分支获取最新的版本到本地有这样2个命令:1. git fetch:相当于是从远程获取最新版本到本地 ...
- ASM:《X86汇编语言-从实模式到保护模式》第七章应用例:用adc命令计算1到1000的累加
在16位的处理器上,做加法的指令是add,但是他每次只能做8位或者16位的加法,除此之外,还有一个带进位的加法指令adc(Add With Carry),他的指令格式和add一样,目的操作数可以是8位 ...
- ajax提交表单
$.ajax({ type: "POST", url: action, data: $('#checkout-form').serialize(), success: functi ...
- 【leetcode】Word Search II(hard)★
Given a 2D board and a list of words from the dictionary, find all words in the board. Each word mus ...
- NEFU 506&&ZOJ 3353 Chess Board (四种构造的高斯消元)
题目链接 题意:有四种翻转方式,问是否能使得所有棋子都变为0,求最小步数. 题解:依次构造枚举求出最小值即可. #include <iostream> #include <cstdi ...
- ios layer 动画-(transform.rotation篇)
x轴旋转: CABasicAnimation *theAnimation; theAnimation=[CABasicAnimation animationWithKeyPath:@"tra ...
- hdu2302(枚举,大数取模)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2303 题意:给出两个数k, l(4<= k <= 1e100, 2<=l<=1 ...
- CodeForces 282C(位运算)
C. XOR and OR time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...