62,628
社区成员
发帖
与我相关
我的任务
分享
package s1;
import java.util.LinkedList;
public class TicectDemo extends Thread implements Concur{
private static int num = 100;
private static ThreadManager manager;
private volatile boolean concur = false;
private String threadName;
public boolean getConcur(){
return concur;
}
public void setConcur(){
concur = true;
}
public String MyGetName(){
return threadName;
}
@Override
public void run() {
threadName = Thread.currentThread().getName();
try {
saleTicket();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void saleTicket() throws InterruptedException{
while(num >0){
while(true){
if(concur == true){
break;
}
}
if(num >0){
System.out.println(Thread.currentThread().getName() + "...sale..." + num--);
}
if(num == 0)
System.exit(0);
concur = false;
manager.flag = true;
Thread.sleep(10);
}
}
public static void main(String[] args) {
Runnable ticectDemo = new TicectDemo();
manager = new ThreadManager();
TicectDemo thread1 = new TicectDemo();
TicectDemo thread2 = new TicectDemo();
TicectDemo thread3 = new TicectDemo();
TicectDemo thread4 = new TicectDemo();
manager.list.add(thread1);
manager.list.add(thread2);
manager.list.add(thread3);
manager.list.add(thread4);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
manager.start();
}
}
class ThreadManager extends Thread{
public LinkedList<Concur> list = new LinkedList<Concur> ();
public volatile boolean flag = true;
public void MyNotify(){
list.removeFirst();
}
public void run(){
while(true){
if (flag == true){
flag =false;
//将链表的第一个放到最后一个
Concur a = list.getFirst();
list.removeFirst();
list.addLast(a);
System.out.println("this is "+a.MyGetName());
a.setConcur();
}
}
}
}
interface Concur {
public boolean getConcur();
public void setConcur();
public String MyGetName();
}
实际上线程同步有楼上所说的JUC方法,也有你写的这种,还有object的notify,wait方法。但是如果你实在既不想用synchronized也不想用lock。还有这种上面这种非常滑稽性能极低的方法,最大程度的牺牲了同步性。这种方法存在的唯一价值就是激怒你的老板。