线程分两种
守护线程(Daemon)
用户线程
守护线程Thread.setDaemon(true)设置
一般程序使用用户线程,特殊的如垃圾回收线程使用守护线程
守护线程为用户线程服务的,用户线程关闭了,守护线程也会关闭。
守护线程定义要在Thread.start()之前
优先级一般较低
@Test
public void testT() {
System.out.println("testT start");
Thread thread = new MyThread();
thread.setName("守护线程");
thread.setDaemon(true);
thread.start();
System.out.println("testT end");
}
class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
System.out.println(Thread.currentThread().getId());
System.out.println("start");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
log.error("e:", e);
}
System.out.println("end");
}
}
多线程
了解了这两个概念之后,我们再来说说什么是多线程。举个例子,我们打开腾讯管家,腾讯管家本身就是一个程序,也就是说它就是一个进程,它里面有很多的功能,我们可以看下图,能查杀病毒、清理垃圾、电脑加速等众多功能。
按照单线程来说,无论你想要清理垃圾、还是要病毒查杀,那么你必须先做完其中的一件事,才能做下一件事,这里面是有一个执行顺序的。
如果是多线程的话,我们其实在清理垃圾的时候,还可以进行查杀病毒、电脑加速等等其他的操作,这个是严格意义上的同一时刻发生的,没有执行上的先后顺序。
线性安全
有时单线程并没有问题,多线程出来时,并发问题可能导致值出现错误
解决线性安全
synchronized关键字
public class ThreadDemo {
int count = 0; // 记录方法的命中次数
public synchronized void threadMethod(int j) {
count++ ;
int i = 1;
j = j + i;
}
}