在平常工做生活中,可能会有用时几我的或是不少人干同一件事,在java编程中,一样也会出现相似的状况,多个线程干一样一个活儿,好比火车站买票系统不能多我的买一到的是同一张票,当某个窗口(线程)在卖某一张票的时候,别的窗口(线程)不容许再卖此张票了,在此过程当中涉及到一个锁和资源等待的问题,如何合理正确的让线程与线程在干同一件事的过程当中,不会抢资源以及一个一直等待一个一直干活的情况,接下来就聊一下多线程的等待唤醒以及切换的过程,在此就以A和B两个线程交替打印奇偶数的例子为例,代码以下:编程
package com.svse.thread;
import java.util.concurrent.atomic.AtomicInteger;多线程
/**
* 交替打印奇偶数
*功能说明:
*@author:zsq
*create date:2019年5月27日 下午4:34:30
*修改人 修改时间 修改描述
*
*Copyright (c)2019北京智华天成科技有限公司-版权全部
*/
public class AlternatePrinting {atom
//让两个线程使用同一把锁。交替执行 。
//判断是否是奇数 若是是奇数进入奇数线程执行打印并加一。而后线程释放锁资源。而后让该线程等待
//判断是否是偶数,若是是偶数进入偶数线程执行打印并加一。而后线程释放锁资源。而后让该线程等待
public static AtomicInteger atomicInteger =new AtomicInteger(1);
public static void main(String[] args) {
Thread a=new Thread(new AThread());
Thread b=new Thread(new BThread());
a.start();
b.start();
}
spa
//奇数线程
public static class AThread implements Runnable{
public void run() {
while(true){
synchronized (atomicInteger) {
if(atomicInteger.intValue()%2 !=0){
System.out.println("奇数线程:" + atomicInteger.intValue());
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
atomicInteger.getAndIncrement(); // 以原子方式将当前值加 1。
// 奇数线程释放锁资源
atomicInteger.notify();//执行完操做后释放锁并进入等待
try {
atomicInteger.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
// 奇数线程等待
try {
atomicInteger.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}线程
//偶数线程
public static class BThread implements Runnable{
public void run() {
while(true){
synchronized (atomicInteger) {
if(atomicInteger.intValue()%2 ==0){
System.out.println("偶数线程:"+ atomicInteger.intValue());
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
atomicInteger.getAndIncrement(); // 以原子方式将当前值加 1。
// 偶数线程释放锁资源
atomicInteger.notify();//执行完操做后释放锁并进入等待
try {
atomicInteger.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
try {
// 偶数线程等待
atomicInteger.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
}code