实现多线程
过程
正在运行的程序
- 是零碎进行资源分配和调用的独立单位
- 每一个过程都有它本人的内存空间和系统资源
线程
是过程中的单个顺序控制流,是一条执行门路
- 单线程 一个过程如果只有一条执行门路,则称为单线程程序
- 多线程 一个过程如果有多条执行门路,则称为多线程程序
多线程的实现形式
形式1 继承Thread类
- 定义一个类MyThread继承Thread类
- 在MyThread类中重写run()办法
- 创立MyThread类的对象
- 启动线程
public class MyThread extends Thread{ //重写run办法 @Override public void run(){ for(int i = 0;i<100;i++){ System.out.ptintln(i); } }}//主程序//创立MyThread对象MyThread my1 = new MyThread();MyThread my2 = new MyThread();//调用run办法并没有启动线程my1.run();my2.run();//start导致此线程开始执行,java虚拟机调用此线程的run办法my1.start();my2.start();
设置和获取线程名称
- 通过setname赋值,getname获取
- 通过带参构造方法给线程设置名称
- 通过动态的currentThread()办法获取以后正在执行线程对象,再用getname获取线程名称
public class MyThread extends Thread{ //重写run办法 @Override public void run(){ for(int i = 0;i<100;i++){ System.out.ptintln(getName()+":"+i);//因为是继承Thread类,所以能够间接调用Thread的getName() } }}//主程序//创立MyThread对象MyThread my1 = new MyThread();MyThread my2 = new MyThread();//将此此线程的名称更改为参数 name//start导致此线程开始执行,java虚拟机调用此线程的run办法my1.setName("高铁"); //给线程设置名称my2.setName("飞机");my1.start();my2.start();
//下图是带参结构和无参结构带参构造方法是thread类里的,所以要继承 用super拜访父类的带参结构MyThread my1 = new MyThread(name:"高铁");MyThread my2 = new MyThread(name:"飞机");
想要看main办法的线程名称,不能间接用getname办法,因为main办法没有继承Thread类
//currentThread() 返回对以后正在执行的线程对象的援用 是静态方法 //所以想要返回main办法的线程名称sout(Thread.currentThread().getName())//输入就是main 阐明main办法就在main这个线程里
线程调度
- 分时调度模型:所有线程轮流应用CPU的使用权,平均分配每个线程占用CPU的工夫片
- 抢占式调度模型:优先让优先级搞的线程应用CPU,如果优先级雷同,则随机抉择一个,优先级高的线程获取的CPU的工夫片绝对多一些
java应用的是抢占式调度模型
控制线程的优先级
public class MyThread extends Thread{ //重写run办法 @Override public void run(){ for(int i = 0;i<100;i++){ System.out.ptintln(getName()+":"+i);//因为是继承Thread类,所以能够间接调用Thread的getName() } }}//主程序//创立MyThread对象ThreadPriority tp1 = new ThreadPriority ();ThreadPriority tp2 = new ThreadPriority ();ThreadPriority tp3 = new ThreadPriority ();tp1 .setName("高铁"); //给线程设置名称tp2 .setName("飞机");tp3 .setName("汽车");//多线程程序执行随机性 //getPriority()返回线程的优先级 全都输入5 这三个线程的优先级一样 所以在执行的时候随机抉择 //返回5阐明零碎默认优先级是5sout(tp1.getPriority());//5sout(tp2.getPriority());//5sout(tp3.getPriority());//5//setPriority()更改线程的优先级tp1.setPriority(1000);//线程优先级更改为1000 会呈现非法参数异样 IllegalArguementException //阐明给的优先级不在范畴内 范畴是1-10 最高优先级是10 最低优先级是1tp1.setPriority(5);tp2.setPriority(10);tp3.setPriority(1);//线程优先级高,仅仅代表获取CPU的工夫片的几率高 而不是每次都跑在最后面tp1.start();tp2.start();tp3.start();
线程管制
join那个必须是其余所有线程都得期待调用了join这个线程执行结束能力运行
setDaemon如果boolean值是true,就是将这个线程标为守护线程,如果主线程运行完,剩下都是守护线程,那么java虚拟机将会退出
public class ThreadSleep extends Thread{ //重写run办法 @Override public void run(){ for(int i = 0;i<100;i++){ System.out.ptintln(getName()+":"+i);//因为是继承Thread类,所以能够间接调用Thread的getName() Thread.sleep(millis:1000);//alt enter捕捉异样 //每输入一次就让这个线程休眠1000ms } }}//主程序//创立MyThread对象ThreadSleep ts1 = new ThreadSleep();ThreadSleep ts2 = new ThreadSleep();ThreadSleep ts3 = new ThreadSleep();ts1 .setName("曹操"); //给线程设置名称ts2 .setName("刘备");ts3 .setName("孙权");---------//设置主线程为诸葛亮Thread.currentThread().setName("诸葛亮");//当主线程完结的时候,其余线程也不必活了//就设置守护线程ts1.setDaemon(true);ts2.setDaemon(true);ts3.setDaemon(true);//设置下面三个为守护线程,主线程完结了,守护线程也完结 但并不会立刻完结 而是挣扎一下再完结了了 很快就执行结束 不是立刻隐没----------ts1.start();ts1.join();//alt enter捕捉异样//下面ts1调用了join办法,则只能ts1执行结束能力走上面的线程ts2 ts3ts2.start();ts3.start();for(int i = 0;i<10,i++){ sout(Thread.currentThread().setName("诸葛亮")+":"+i);//诸葛亮执行到9}
sleep办法
join办法
后面的线程执行结束,能力执行前面的线程
线程生命周期
多线程的实现形式
实现Runnable接口
- 当以一个类MyRunnable实现Runnable接口
- 在MyRunnable类中重写run()办法
- 创立MyRunnable类的对象
- 创立Thread类的对象,把MyRunnable对象作为构造方法的参数
- 启动线程
//自定义的MyRunnable类public class MyRunnable implements Runnable{ //重写run办法 @Override public void run(){ for(int i = 0;i<100;i++){ System.out.ptintln(getName()+":"+i);//因为是用的Runnable接口,不是Thread类,所以不能间接调用Thread的getName() //下面的应该改为 System.out.ptintln(Thread.currentThread().getName()+":"+i);//拿到以后执行的线程 } }}//主程序//创立MyRunnable对象MyRunnable my = new MyRunnable();//创立Thread类的对象,把MyRunnable对象作为构造方法的参数//Thread(Runnable target) 默认参数名 无参结构Thread t1 = new Thread(my);Thread t2 = new Thread(my);//有参结构 设置线程名称Thread t1 = new Thread(my,name:"高铁");Thread t2 = new Thread(my,name:"飞机");//启动线程t1.start();t2.start();
接口不影响继承其余类,MyRunnable相当于一个资源,能够有多个线程调用