点我跳过黑哥的卑鄙广告行为,进入正文。html
Java多线程系列更新中~java
正式篇:多线程
番外篇(神TM番外篇):函数
参数声明:线程
public class Multi extends Thread{ public void run() { for(int i=1; i<1000; i++) { //try { // Thread.sleep(500); //}catch (InterruptedException e) { // e.printStackTrace(); //} System.out.println(i); } } public static void main(String[] args) { Multi t1 = new Multi(); Multi t2 = new Multi(); t1.start(); t2.start(); } }
输出状况(每台计算机不同,每次运行也会不同,我截取部分数据分析)code
t1: 一、二、三、四、五、六、七、八、九、10htm
t2: 一、二、三、四、五、六、七、8blog
t1: 十一、十二、1三、1四、1五、1六、1七、1八、1九、20、2一、2二、2三、2四、2五、2六、2七、2八、2九、30生命周期
……
能够看出,这两个线程的确是交替执行的。JAVA采用抢占式线程调度,也就是每一个线程由系统来分配时间,线程的切换并不禁线程自己决定。
public class Multi extends Thread{ public void run() { for(int i=1; i<1000; i++) { try { Thread.sleep(500); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i); } } public static void main(String[] args) { Multi t1 = new Multi(); Multi t2 = new Multi(); t1.start(); t2.start(); } }
这个输出就是严格的一个一次的交替原则。
t1: 1
t2: 1
t1: 2
t2: 2
t1: 3
……
这是由于Sleep()使得当前线程进入阻塞状态,系统便调用了另外一线程,循环往复,便出现了上面的输出结果。那么,什么状况阻塞,只有Sleep吗?这就引出了线程的生命周期。