java多线程面试题

 

有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC…

由于线程执行的不确定性,要保证这样有序的输出,必须控制好多线程的同步。

线程同步有两种基本方法:

(1)    synchronized

(2)    wait,notify,notifyAll

现在分别采用这两种方法来解答这道题目。


 

public class Demo01 {

public static void main(String[] args) {

StartLock lock = new StartLock();

new Thread(new Method1("A", lock),"线程一").start();

new Thread(new Method1("B", lock),"线程二").start();

new Thread(new Method1("C", lock),"线程三").start();

}

}

 

class Method1 implements Runnable {

private String name = "";

private StartLock lock = null;

private int count=10;

public Method1(String name, StartLock lock) {

this.name = name;

this.lock = lock;

}

 

@Override

public void run() {

while(count>0) {

synchronized (lock) {

if (lock.getName().equalsIgnoreCase(this.name)) {

System.out.print("当前线程名:"+Thread.currentThread().getName()+" "+name+"    ");

if(name == "C"){

System.out.println() ;

}

count--;

if (this.name.equals("A")) {

lock.setName("B");

} else if (this.name.equals("B")) {

lock.setName("C");

} else if (this.name.equals("C")) {

lock.setName("A");

}

}

}

}

}

}

class StartLock {

public String name = "A";

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

 

//----------------------------------------------------------------------------------------------------------------------------------

//方法(二)线程类修改如下,其他类一样:

class Method2 implements Runnable {

private String name = "";

private StartLock lock = null;

private int count=10;

public Method2(String name, StartLock lock) {

this.name = name;

this.lock = lock;

}

   @Override

     public void run() {

while(count>0) {

synchronized (lock) {

while(!lock.getName().equalsIgnoreCase(this.name)) {

try{

lock.wait();

}catch(InterruptedException e){

e.printStackTrace();

}

}

System.out.print(name);

count--;

if (this.name.equals("A")) {

lock.setName("B");

} else if (this.name.equals("B")) {

lock.setName("C");

} else if (this.name.equals("C")) {

lock.setName("A");

}

lock.notifyAll();

}

}

}

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值