首页 > 代码库 > java多线程面试题
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();
}
}
}
}
java多线程面试题