Java学习日记18——多线程
线程简单来说就是在一个程序中有多个任务在执行,比如一边下载一边看剧。但是实际上是多个任务共享CPU时间片段。并非是真正的同时执行。Java支持语言级别的多线程。例如object中的wait,notify以及java.lang里的类Thread等。线程一般是在执行时间比较长的情况。
线程的创建的两种方法:
1.通过继承Thread类创建线程,然后重写run方法来实现运行。
例如:
class Counter extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
}
}
2.通过Thread的构造方法传递Runnable接口对象来创建线程。
例如:
class Counter implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
}
}
无论是哪种方法都是需要重写run方法来实现,完成方法的书写后就可以创建线程对象,调用start方法启动线程。
线程的启动是用start(),线程的结束是当run方法内完成运行后自动结束。暂时停止线程执行则可以使用sleep(Time)方法进行休眠。一般sleep需要捕获异常。
线程一般分为两类:
1.普通线程,在Java程序中,只要还有普通线程在运行,那么程序就不会结束。
2.Daemon线程(守护线程,后台线程),如果普通线程执行完成了,后台线程就会自动终止,例如垃圾回收线程,在普通线程结束后,就自动结束运行,他不会阻止虚拟机的结束。设置收获线程使用的方法是setDaemon(true)。例如
Thread t = new MyThread();
t.setDaemon(true);
t.start();
线程的同步
同时运行的线程需要共享数据,就必须考虑将线程的状态和行为,这是就必须要实现同步。在Java中的每一个对象都引入了互斥锁的概念,来保证数据共享操作的完整性,每个对象都有一个monitor监视器,称为互斥锁(lock,mutex)标记,保证在任意时刻,只有一个线程可以访问该对象。使用关键字synchronized用来与对象的互斥锁联系。