1.在使用线程时,为什么不直接调用run()方法而是调用了start():
直接调用run()方法,不存在线程的启动,属于调用实例方法,只有一条执行路径,不存在多线程并行交替执行了。调用start()方法属于启动线程,将自动调用run()方法
2.子线程循环 10次,接着主线程循环 100次,接着又回到子线程循环 10次,接着再回到主线程又循环 100次,如此循环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;//标志子线程方法是否被调用 public synchronized void subThread(int i){ if(!bShouldSub){//若子线程没被调用,即主线程正在运行,所以等待 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;//子线程运行完毕 this.notify();//唤醒其他线程,即主线程 } public synchronized void mainThread(int i){ if(bShouldSub){//若子线程正在被调用,所以等待 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;//主线程调用完毕 this.notify();//唤醒子线程 } }
3.编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按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()方法的区别:
1.wait()方法用于将当前线程处于等待状态,它是Object类的;sleep()是将当前线程休眠,它是Thread
2.wait()将锁释放,sleep()方法不会释放锁
5.生产者和消费者