线程面试题

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.生产者和消费者

  

  

转载于:https://www.cnblogs.com/xiao-ran/p/10735496.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值