线程面试题
1.在使用線程時(shí),為什么不直接調(diào)用run()方法而是調(diào)用了start():
直接調(diào)用run()方法,不存在線程的啟動(dòng),屬于調(diào)用實(shí)例方法,只有一條執(zhí)行路徑,不存在多線程并行交替執(zhí)行了。調(diào)用start()方法屬于啟動(dòng)線程,將自動(dòng)調(diào)用run()方法
2.子線程循環(huán) 10次,接著主線程循環(huán) 100次,接著又回到子線程循環(huán) 10次,接著再回到主線程又循環(huán) 100次,如此循環(huán)50次
public class ThreadTest{ public static void main(String[] args) { final MyThread threads=new MyThread(); new Thread( new Runnable(){ public void run(){ for(int i=1;i<=50;i++){ threads.subThread(i); } } } ).start(); new Thread(new Runnable(){ public void run(){ for(int i=1;i<=50;i++){ threads.mainThread(i); } } }).start(); } } class MyThread{ boolean bShouldSub=true;//標(biāo)志子線程方法是否被調(diào)用 public synchronized void subThread(int i){ if(!bShouldSub){//若子線程沒(méi)被調(diào)用,即主線程正在運(yùn)行,所以等待 try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int j=1;j<=10;j++){ System.out.println("sub thread :"+i+",loop : "+j); } bShouldSub=false;//子線程運(yùn)行完畢 this.notify();//喚醒其他線程,即主線程 } public synchronized void mainThread(int i){ if(bShouldSub){//若子線程正在被調(diào)用,所以等待 try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int j=1;j<=100;j++){ System.out.println("main thread :"+i+",loop : "+j); } bShouldSub=true;//主線程調(diào)用完畢 this.notify();//喚醒子線程 } }3.編寫(xiě)一個(gè)程序,開(kāi)啟3個(gè)線程,這3個(gè)線程的ID分別為A、B、C,每個(gè)線程將自己的ID在屏幕上打印10遍,要求輸出結(jié)果必須按ABC的順序顯示
public class TestThread { /** * @author lucky */ public static void main(String[] args) { new Thread(new TestRun("A")).start(); new Thread(new TestRun("B")).start(); new Thread(new TestRun("C")).start(); } } class TestRun implements Runnable { private String name; private static String flag = "A"; private int count = 10; TestRun(String name) { this.name = name; } @Override public void run() { while (count > 0) { synchronized (flag) { if (flag.equals(name)) { System.out.print(name); count--; if (name.equals("A")) flag = "B"; if (name.equals("B")) flag = "C"; if (name.equals("C")) flag = "A"; } } } } }4.wait()方法和sleep()方法的區(qū)別:
1.wait()方法用于將當(dāng)前線程處于等待狀態(tài),它是Object類(lèi)的;sleep()是將當(dāng)前線程休眠,它是Thread
2.wait()將鎖釋放,sleep()方法不會(huì)釋放鎖
5.生產(chǎn)者和消費(fèi)者
轉(zhuǎn)載于:https://www.cnblogs.com/xiao-ran/p/10735496.html
總結(jié)
- 上一篇: C#相对路径
- 下一篇: leetcode 994.腐烂的橘子