一个单CPU的机器,如何同时执行多个线程?请简述其原理 在一个时间段内,同时处理这几个线程,谁抢到cpu谁就执行,cpu一般不会把一个线程完全处理完再去处理另外一个线程,而是最低限度为处理一个线程的一个语句,直到把每个线程处理完
调用线程对象的start()方法会执行run()方法,为什么不能直接调用run()方法? 直接调用run()方法 不会启动线程 而是调用了一个方法而已
线程的生命周期中包含几种状态,请描述每种状态的特征
新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread()
就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行
运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就 绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中
阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种: 1.等待阻塞 :运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态; 2.同步阻塞 :线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态; 3.其他阻塞 :通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
习题1
package test; public class No1 extends Thread{ @Override public void run() { // TODO Auto-generated method stub for (int i = 1; i <= 5; i++) { System.out.println(Thread.currentThread().getName()+"——>"+i); } } } package test; public class No1_2 implements Runnable { public void run() { for (int i = 1; i <= 5; i++) { System.out.println(Thread.currentThread().getName()+"——>"+i); } } } package test; public class No1_test { public static void main(String[] args) { //继承方法启动线程 No1 Th1 = new No1(); Th1.setName("线程1"); Th1.start(); //接口方式启动线程 No1_2 Th2 = new No1_2(); new Thread(Th2,"线程2").start();; } }习题2
package test; public class No2_test { public static void main(String[] args) { No2 h1 = new No2(); No2 h2 = new No2(); new Thread(h1,"张三").start(); new Thread(h1,"张三的妻子").start(); } } package test; public class No2 implements Runnable { private int money = 500; // 总共500 public void run() { for (int i = 0; i < 5; i++) { getMoney(); } } private synchronized void getMoney() { System.out.println(Thread.currentThread().getName() + "准备取款"); if (money >= 100) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "完成取款"); money -= 100; } else { System.out.println("余额不足以支付" + Thread.currentThread().getName() + "的取款,余额为:" + money); } } }