继承的方式创建多线程 笔记:
/**继承的方式创建多线程 * 线程的创建方法: * 1.创建一个继承于Thread 的子类 * 2.重写Thread类的run()方法 ,方法内实现此子线程 要完成的功能 * 3.创建一个子类的对象 * 4.调用线程的start() ,启动此线程,调用相应的run()方法 * 易错总结: * 1.每个Thread只能start()一次! * 2.多个Thread之间争抢到CPU的时间不总是一致的! * ------------------------------------------- * 线程的常用方法: * 1.start() /run() * 2.Thread currentThread() ;//静态的,返回当前的线程Thread类型 * 3.yield() :静态方法实现线程的让步一次, 类似于sleep() * 4.join( ) : 假设在A线程中调用B线程的join()方法,表示当执行到此方法时,A线程停止; * 直至B线程执行完毕,A线程再接着join()之后的代码执行 * 5.getName() /setName() * 8.isAlive() :判断当前线程是否还存活! * 9.sleep(long l ): 显式地让子线程睡眠1毫秒! * 10.线程通信 wait() notify() notifyall() * * 设置线程的优先级:setPriority(MaxPriority / MinPriority) /getPriority() */
继承的方式创建多线程 代码:
import org.junit.Test; //1.创建一个继承于Thread 的子类 class SubThread extends Thread{ //2.重写Thread类的run()方法 ,方法内实现此子线程 要完成的功能 public void run(){ for(int i=1;i<=20;i++){ try { Thread.currentThread().sleep(10); System.out.println(Thread.currentThread().getName()+"睡眠10ms!"); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(currentThread().getName()+" "+i+"\t"); } } } public class TestThread { //[1] 测试1:两个线程同时输出20个数,每次运行的结果不一致! public static void main(String[] args) throws InterruptedException { //3.创建一个子类的对象 Thread st=new SubThread(); //4.调用线程的start() ,启动此线程,调用相应的run()方法 st.setName(" 子线程 "); st.start(); Thread.currentThread().setName(" 主线程 "); //作为比较的主线程! for(int i=21;i<=40;i++){ System.out.println(Thread.currentThread().getName()+" "+i+"**"); // if(i%5==0) // Thread.currentThread().yield(); st.join(); } } @Test //[2] 测试2:多线程的练习 public void test2(){ (new Thread1()).start(); (new Thread2()).start(); } class Thread1 extends Thread{ public void run() { for(int i=1;i<=50;i++){ if(i%2==0) System.out.println(currentThread().getName()+": "+i); } } } class Thread2 extends Thread{ public void run() { for(int i=1;i<=50;i++){ if(i%2!=0) System.out.println(currentThread().getName()+": "+i); } } } }
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
主线程 21** 子线程 睡眠10ms! 子线程 1 子线程 睡眠10ms! 子线程 2 子线程 睡眠10ms! 子线程 3 子线程 睡眠10ms! 子线程 4 子线程 睡眠10ms! 子线程 5 子线程 睡眠10ms! 子线程 6 子线程 睡眠10ms! 子线程 7 子线程 睡眠10ms! 子线程 8 子线程 睡眠10ms! 子线程 9 子线程 睡眠10ms! 子线程 10 子线程 睡眠10ms! 子线程 11 子线程 睡眠10ms! 子线程 12 子线程 睡眠10ms! 子线程 13 子线程 睡眠10ms! 子线程 14 子线程 睡眠10ms! 子线程 15 子线程 睡眠10ms! 子线程 16 子线程 睡眠10ms! 子线程 17 子线程 睡眠10ms! 子线程 18 子线程 睡眠10ms! 子线程 19 子线程 睡眠10ms! 子线程 20 主线程 22** 主线程 23** 主线程 24** 主线程 25** 主线程 26** 主线程 27** 主线程 28** 主线程 29** 主线程 30** 主线程 31** 主线程 32** 主线程 33** 主线程 34** 主线程 35** 主线程 36** 主线程 37** 主线程 38** 主线程 39** 主线程 40**
线程模拟模拟火车站开启三个窗口售票代码:
package 任务196_多线程; /**模拟火车站开启三个窗口售票,火车站总票数20张! * */ class Window extends Thread{ static int tickets=20; public void run() { while(true){ if(tickets>0){ System.out.println(currentThread().getName()+" 为您售票!"+ "剩余票数:"+tickets); tickets--; } else break; //记得在这里解除死循环!! } } } public class TestWindows { public static void main(String[] args) { Window w1=new Window(); Window w2=new Window(); Window w3=new Window(); w1.setName("窗口1"); w2.setName("窗口2"); w3.setName("窗口3"); w1.start(); w2.start(); w3.start(); } }
线程模拟模拟火车站开启三个窗口售票运行结果:
窗口2 为您售票!剩余票数:20 窗口3 为您售票!剩余票数:20 窗口1 为您售票!剩余票数:20 窗口3 为您售票!剩余票数:18 窗口2 为您售票!剩余票数:19 窗口2 为您售票!剩余票数:15 窗口3 为您售票!剩余票数:16 窗口1 为您售票!剩余票数:17 窗口3 为您售票!剩余票数:13 窗口2 为您售票!剩余票数:14 窗口3 为您售票!剩余票数:11 窗口3 为您售票!剩余票数:9 窗口3 为您售票!剩余票数:8 窗口3 为您售票!剩余票数:7 窗口3 为您售票!剩余票数:6 窗口3 为您售票!剩余票数:5 窗口3 为您售票!剩余票数:4 窗口3 为您售票!剩余票数:3 窗口3 为您售票!剩余票数:2 窗口3 为您售票!剩余票数:1 窗口1 为您售票!剩余票数:12 窗口2 为您售票!剩余票数:10