您的位置:首页 > 编程语言 > Java开发

Java多线程交替输出01010......

2017-02-17 16:39 183 查看
1.先简单了解多线程并发,同步和异步的概念

多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线程的处理的数据,而B线程又修改了A线程处理的数理。显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑使用局部变量,退而求其次使用同步代码块,出于这样的安全考虑就必须牺牲 系统处理性能,加在多线程并发时资源挣夺最激烈的地方,这就实现了线程的同步机制

同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求不到,怎么办,A线程只能等待下去

异步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程仍然请求的到,A线程无需等待
显然,同步最最安全,最保险的。而异步不安全,容易导致死锁,这样一个线程死掉就会导致整个进程崩溃,但没有同步机制的存在,性能会有所提升

2.通过代码介绍实现多线程交替输出010101......

/**
* 交替输出0101010101010101......
*/
public class AlternateOutPutZeroOne implements Runnable{

private boolean flag;
private int count;

@Override
public void run() {
while (count < 200){
alternateOutput();
}
System.out.println("count="+count);
}

public synchronized void alternateOutput(){
//检测当前是A线程
if(Thread.currentThread().getName().equals("A")){
try {
count ++;
if(flag){
//检测到已经输出过0则释放资源等待
wait();
}else {
flag = true;
System.out.println("AAAAAA0");
}
//通知其他线程去激活
notify();
//                Thread.sleep(1000);

} catch (InterruptedException e) {
e.printStackTrace();
}

}else if(Thread.currentThread().getName().equals("B")){
try {
count ++;
if(!flag){
//检测到已经输出过1则释放资源等待
wait();
}else {
flag = false;
System.out.println("BBBBBB1");
}
//通知其他线程去激活
notify();
//                Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
调用方法如下
AlternateOutPutZeroOne run = new AlternateOutPutZeroOne();
Thread a = new Thread(run);
a.setName("A");
Thread b = new Thread(run);
b.setName("B");

a.start();
b.start();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息