线程分两种
守护线程(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; } }