线程:我们称正在运行的程序叫"进程";而在一个进程中可以有多个执行单元同时运行,这些执行单元就叫“线程”;
线程创建:(1)继承java.lang包下的Thread类,复写Thread类的run()方法;
public class MyThread extends Thread{
public static void main(String[] args) {
Test1 test1=new Test1();//创建线程对象
test1.start();//开启线程,默认执行其run()方法;
}
}
class Test1 extends Thread
{
public void run() {
while (true)
{
System.out.println("方法1执行");
}
}
}
(2)实现java.lang.Runnable接口,同样复写run()方法;
public class MyThread extends Thread{
public static void main(String[] args) {
Test1 test1=new Test1();//创建Test1实例对象
Thread thread=new Thread(test1);//创建线程对象
thread.start();//开启线程,默认执行其run()方法;
}
}
class Test1 implements Runnable
{
public void run() {
while (true)
{
System.out.println("方法1执行");
}
}
}
实现Runnable接口适合处理共享统一资源的情况,且可以避免java单继承带来的局限性;大多数情况下还是用实现Runnable接口的方式来创建多线程;
线程的生命周期:
新建状态;就绪状态;运行状态;阻塞状态;死亡状态;
线程优先级:用1~10来表示:数字越大,优先级越高;
死锁问题:当资源抢夺或者程序推进顺序非法时会出现;
解决:
预防死锁
破坏死锁的四个必要条件中的一个或多个来预防死锁。
避免死锁
和预防死锁的区别就是,在资源动态分配过程中,用某种方式防止系统进入不安全的状态。
检测死锁
运行时出现死锁,能及时发现死锁,把程序解脱出来
解除死锁
发生死锁后,解脱进程,通常撤销进程,回收资源,再分配给正处于阻塞状态的进程。