Java中线程的同步问题

时间:2023-03-10 06:51:27
Java中线程的同步问题

  在生活中我们时常会遇到同步的问题,而且大多数的实际问题都是线程的同步问题

我这里以生活中的火车售票来进行举例:

  假设现在我们总共有1000张票要进行出售,共有10个出售点,那么当售票到最后只有一张票时,每个售票点如何去处理这唯一的一张票?或者对于某一张票而言,假设它正在售票站1售票的程序执行过程中,但是还没有出售,那么此时,其他售票站改如何去处理这张票呢?

  这时,应该考虑使用java中的同步机制;

方法一:使用Runnable接口实现

package thread;

public class TSynchronize {
public static void main(String[]ages){
int l=;
Syn []s=new Syn[l];
Thread [] t=new Thread[l];

     //创建10个火车票售票点
for(int i=;i<l;i++){
s[i]=new Syn();
t[i]=new Thread(s[i]);
t[i].setName((i+)+"号口");
}

    //启动线程
for(int i=;i<l;i++){
t[i].start();
}
} } class Syn implements Runnable{
private static int count=;  //总共的票数
private static String key="key"; //synchronized是为了实现同步,其中所管辖的代码块要么全执行,要不全不执行
//synchronized如果修饰的是函数,则指调用它的函数的对象 ,它不需要字符串,默认为this;如果修饰的是代码块则需要使用字符串
public void run(){ while(count>){
synchronized(key){ //synchronized 可以修饰函数和代码块 key 线程执行时的令牌口令,可以是任何值
if(count>){
System.out.println("第"+Thread.currentThread().getName()+"在卖第"+(-count)+"张票");
count--;
}else{
break;
}
}
}
System.out.println("第"+Thread.currentThread().getName()+"的票已经卖完");
}
}

执行结果:

Java中线程的同步问题  Java中线程的同步问题  Java中线程的同步问题

方法二:继承Thread类:

package thread;

public class TSynClass {
public static void main(String []ages){
int l=10;
Point[] p=new Point[10]; for(int i=0;i<l;i++){
p[i]=new Point ();
p[i].setName((i+1)+"号口");
} for(int i=0;i<l;i++){
p[i].start();
}
}
} class Point extends Thread{
private static int count =1000; //共享票数
private static String key="key"; //共享线程口令,让其进行争夺 public void run(){
while(count>0){
synchronized(key){ //两个线程的key是自己的,不是公共的
if(count>0){
System.out.println("第"+this.currentThread().getName()+"正在买第"+(1001-count)+"张票");
count--;
}else{
break;
}
}
} System.out.println("第"+this.currentThread().getName()+"的票已经卖完");
}
}

执行结果:

Java中线程的同步问题Java中线程的同步问题  Java中线程的同步问题