最近在复习java,刚好看到java多线程,所以就把自己学习的一些心得写下来,保存,方便以后自己再看
一:
在java中,线程分成两类:用户线程和守护线程
先来说说用户线程:运行在前台。执行具体的任务程序的主线程,连接网络的子线程等都是用户线程
用户线程的实现方式有两种方法:1.继承Thread类,2.实现Runnable方法。
请看如下示例代码:
继承Thread类实现多线程:
package com.test;
public class ThreadTestDemo extends Thread{
@Override
public void run(){
while(true){
/**
*可以在run方法中实现自己的逻辑
**/
System.out.println("通过继承Thread方法实现多线程");
}
}
public static void main(String[] args) {
ThreadTestDemo threadTestDemo = new ThreadTestDemo();//创建线程
threadTestDemo.start();//实现线程
}
}
实现Runnable接口:
package com.test;
public class RunnableTestDemo implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
/**
* 在这里实现自己的逻辑
*/
while (true){
System.out.println("通过实现Runnable方法实现多线程");
}
}
public static void main(String[] args) {
RunnableTestDemo runnableTestDemo = new RunnableTestDemo();
Thread thread = new Thread(runnableTestDemo);//创建线程
thread.start();//实现线程
}
}
上述代码就是两种实现多线程的方法,上述代码的共同点就是都要new一个Thread对象,然后调用start()方法。
不同点
1:就是Runnable方式可以避免Thread方式由于java单继承特性带来的缺陷
2:Runnable的代码可以被多个线程(Thread实例)共享适合于多个线程处理同一资源的情况
建议:一般情况下使用实现Runnable接口的方式
二:
线程的生命周期
如上图所示:线程的整个生命周期,创建一个线程,通过调用start()方法,让线程进入就绪状态,获取到CPU的命令后进入运行状态,如果有阻塞时间或者命令,就进入阻塞状态,阻塞状态解除以后,重新进入就绪状态获取CPU指令,或者直接线程终止。
守护线程:运行在后台。为其他的前台线程服务
特点:一旦所有用户线程都结束运行,守护线程随JVM一起结束工作
应用:数据库连接池的检测线程,jvm虚拟机启动后的监测线程
最常见的守护线程:垃圾回收线程
如何设置守护线程:通过调用Thread类的setDaemon(true)方法来设置当前的线程为守护线程
注意事项:setDaemon(true)方法必须在start()方法之前调用,否则会抛出IllegalThreadStateException异常
2:在守护线程中产生的新线程也是守护线程
3:不是所有的任务都可以分配给守护线程来执行,比如读写操作,或者逻辑计算