使用两个线程分别输出100以内的奇数和偶数,并按从小到大的顺序输出
程序员文章站
2022-03-04 18:40:34
...
不啰嗦,直接上干货!
我用的是线程通讯wait(等待)和notify(唤醒)步骤如下:
首先定义一个公共类:
package demo10;
public class ShareData {
public int i;
public int max;
public boolean isEven=false;
public ShareData(int i,int max){
this.i=i;
this.max=max;
isEven=i%2==0?true:false;
}
//输出奇数
public synchronized void getNotEven(){
//如果该输出偶数则先等待
if (!isEven){
System.out.println("奇数:"+i);
i++;
isEven=true;
notify();
}else{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//输出偶数
public synchronized void getEven(){
if (isEven){
System.out.println("偶数:"+i);
i++;
isEven=false;
notify();
}else{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
然后创建一个输出奇数的线程:
package demo10;
public class MyThread extends Thread {
private ShareData s;
public MyThread(ShareData s){
this.s=s;
}
public void run(){
for (int i=s.i;i<=s.max;i++){
s.getNotEven();
}
}
public static void main(String[] args) {
ShareData s=new ShareData(1,100);
MyThread myThread=new MyThread(s);
EvenThread myThread1=new EvenThread(s);
myThread.start();
myThread1.start();
}
}
再创建一个输出偶数的线程:
package demo10;
public class EvenThread extends Thread{
private ShareData s;
public EvenThread(ShareData s){
this.s=s;
}
public void run(){
for (int i=s.i;i<=s.max;i++){
s.getEven();
}
}
}
在找测试类?本人比较懒,直接写在奇数线程类(MyThread)里边了,下边是运行结果:
谢谢支持!
上一篇: 数据库及表的修改和删除