1 . sleep() 在睡眠的时候 会释放cpu 让给其他线程执行, 即使没有其他线程 抢占cpu 也需要等待睡眠时间到了以后才能真正的指定. package com.qf.demo3; public class Test2 { public static void main(String[] args) { MyThread2 thread2 = new MyThread2(); MyThead3 thead3 = new MyThead3(); thread2.start(); thead3.start(); } } class MyThread2 extends Thread{ @Override public void run() { for (int i = 0; i < 20; i++) { try { if(i>5){ Thread.sleep(1000);// 可以让线程 睡眠 指定的毫秒数 // 在睡眠的时候 会释放cpu 让给其他线程执行 // 即使没有其他线程 抢占cpu 也需要等待睡眠时间到了以后才能真正的指定 } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"--->"+i); } } } class MyThead3 extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("二狗跑了"+i+"圈"); } } } 2 . yield(); 执行的时候 会 让出cpu , 但是 会立马同其他的线程抢占 cpu package com.qf.demo3; public class Test3 { public static void main(String[] args) { MyThrad4 myThrad4 = new MyThrad4("白志凯"); MyThead5 myThead5 = new MyThead5(); myThrad4.start(); myThead5.start(); } } class MyThrad4 extends Thread{ public MyThrad4(String name) { super(name); } @Override public void run() { for (int i = 0; i < 20; i++) { Thread.yield();// 执行的时候 会 让出cpu , 但是 会立马同其他的线程抢占 cpu System.out.println(Thread.currentThread().getName()+"跑了"+i+"圈"); } } } class MyThead5 extends Thread{ @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println("不傻的跑了"+i+"圈"); } } } 3 . join()方法在哪个线程被调用,则就插入到哪个线程前面. 此可实现插队 和 合并 package com.qf.demo3; /** * join 插队 , 合并 * * @author Administrator * */ public class Test4 { public static void main(String[] args) { TwoDog twoDog = new TwoDog(); twoDog.start(); try { twoDog.join();// 二狗想要插队 // 插队到当前线程前面 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for (int i = 0; i < 100; i++) { System.out.println("主线程执行了"+i+"次"); } } } class TwoDog extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("英文二狗执行了"+i+"次"); } } } 4 . 以下代码实现合并 package com.qf.demo3; /** * join方法 插队 合并 * 插队到的是当前线程前面(join方法在哪线程中被调用的 , 插队到哪个线程) * @author Administrator * */ public class Test5 { public static void main(String[] args) { First first = new First(); first.start(); try { first.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for (int i = 0; i < 100; i++) { System.out.println("主线程执行了"+i+"次"); } } } class First extends Thread{ @Override public void run() { Second second = new Second(); second.start(); try { second.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for (int i = 0; i < 100; i++) { System.out.println("第一个线程执行了"+i+"次"); } } } class Second extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("第二个线程执行了"+i+"次"); } } } |