此种编写适合:
即存在多线程情况,又存在资源共享线程不安全时需要同步的情况。
首先建立资源类–这个类是具体干活的类,需要实现的方法写这里。
每次需要根据实际需求重新编写。
public class Zyl { //建立一个资源类
private int ps;
public Zyl(int ps){ //构造方法传参(ps)
this.ps=ps;
}
public synchronized boolean mp(){ //方法名前用synchronized(同步)修饰,有布尔类型返回值
boolean fhz=false; //fhz初始赋值为false
if(ps>0){
try {
Thread.sleep(100); //每次ps取值后调用静态方法休眠100毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
ps--;
System.out.println(Thread.currentThread().getName()+"卖出一票,还剩"+ps+"票");
}else{
fhz=true; //ps<=0时fhz重新赋值为true
}
return fhz;
}
建立线程类,这个类是把资源类对象传参进来,重写run方法里面调用资源类方法干活,是固定的,只需少量改动或不改动
package abc;
public class Xcl implements Runnable{ //建立一个线程类 实现Runnable接口
private Zyl zyl;
public Xcl(Zyl zyl){ //构造方法传参 (资源类对象)
this.zyl=zyl;
}
public void run(){ //重写run方法
while(true){ //死循环
if(zyl.mp()){ //为退出做条件,如果mp返回值为真则退出
break;
}
zyl.mp(); //传参来的zyl对象执行mp方法
}
}
}
建立执行类,
这个类是建资源类对象传参,
建线程类对象把资源类对象传参进去,
再把线程类对象传参给新建的几个多线程对象
这个类也是固定的,少许改动或不改动。
package abc;
public class Zxl { //建立一个执行类 (建多个Thread对象)
public static void main(String[] args) {
Zyl mm=new Zyl(300); //资源类建对象 传参实际总开始票数
Runnable cc=new Xcl(mm); //线程类建对象 传参资源类对象
Thread ck1=new Thread(cc,"张学友"); //根据需要建三个线程对象
Thread ck2=new Thread(cc,"刘德华"); //并传参线程对象和每个线程的实际名字
Thread ck3=new Thread(cc,"郭富城");
ck1.start(); //每个线程分别调用start方法去抢先执行run方法
ck2.start();
ck3.start();
}
}