线程知识点
一.如何创建线程?1.继承thread 类并重写其中的run方法。 1.1 定义一个类继承Thread类 1.2 重写run方法 1.3 创建对象,也就是线程对象 1.4 调用方法start,开启线程并让线程执行,同时让Java虚拟机调用run方法。
class MyThread extends Thread{private String name;MyThread(String name){this.name=name;}public void run(){for(int i=0;i<10;i++){system.out.println(name+" "+i);}}}class Threademo {public static void main(String[] args){ MyThread m1=new MyThread("王明"); MyThread m2=new MyThread("李阳"); m1.start(); m2.start();}}
调用run方法和start方法的区别: 调用run方法不开启线程,调用start方法开启线程并使得对象调用run方法。2.声明实现runnable接口 2,1 定义类实现Runnable接口 2.2 覆盖接口的Runnable的Run方法,将线程任务代码定义到run方法 2.3 创建Thread类的对象 2,4 将实现接口的子类对象作为参数传给Thread的构造方法。 2.5 调用start方法启动线程。
class demo implements Runnable{ private String name; demo(String name) { this.name=name; } public void run() { for(int i=0;i<10;i++) { system.out.println(name+" "+Thread.currentThread().getName()+" "+i); } } }class Threaddemo2{public static void main(Stirng[] args){ //创建demo子类的对象,非线程对象。 demo d=new demo(“demo”);//创建Thread类的对象,将runnable接口的对象作为参数传给Thread的对象。 Thread t1=new Thread(d); Thread t2=new Thread(d);//将线程启动 t1.start(); t2.start();
二.两种方式比较好用?
1.实现接口的方式比较好,避免了单继承的局限性,较为常用。为什么要传参数:private Runnable target;Thread(Runnable target){this.target=target;}public void run(){if(target!=null){target.run();}}Runnable d =new demo;Thread t1=new Thread(d);线程任务已被封装到Runnable接口的run方法中,run方法所属于runnable子类对象,所以要将这个子类对象作为参数传给Thread的构造函数,这样,线程对象创建时可以明确线程任务。
2.继承Runnable接口这种方式更符合面向对象思想。线程分为两部分,一部分为线程对象,一部分为线程任务。继承Thread类的方法将线程任务和线程对象耦合在一起。
三.后台线程:
守护线程,自动结束t2.setDaemon(boolean 类型的true或false)即为后台线程。进程结束它即结束。
四.线程的状态:阻塞状态,具备CPU的执行权(运行状态),不具备CPU的执行权,睡眠状态,等待状态
五.线程的优先级:将getName变成tostring后 ,返回线程名称,线程优先级,线程组线程组(Thread group):通过Thread构造方法明确线程对象所属的线程组。高优先级执行先于低优先级,10级的先于5级的。优先级用数字表示,1到10表示。默认的优先级为5级。最明显的优先级是1,5,10用setpriority设置优先级。格式:setpriority(Thread.Maxpriority)主线程组是默认的。interrupt中断线程。
六.线程睡眠
1.sleep方法和wait方法的异同
1.1 相同点:都处于冻结状态
1.2 不同点:sleep方法必须指定时间,wait方法可指定时间也可不指定 时间
sleep是时间到了会临时处于阻塞状态,wait如果没有指定时间,必须通过notify或 all notifyall唤醒。
sleep不一定必须定义在同步中,wait必须在同步中 都定义在同步中,线程执行到sleep不会释放锁,执行到wait会释放锁。
2.线程如何停止?
七.线程让步
yield()方法线程临时暂停。Thread.yield();线程临时暂停。将执行权释放,让其他线程执行。
下一篇: call和apply区别/bind的使用