1.线程有6种状态:新建,运行,等待,阻塞,计时等待,终止。
如何创建一个线程:
1.首先声明一个类继承Thread类,该子类还应覆盖run方法 比如:
class MyThread extends Thread{
public void run(){}
}
2.然后创建一个线程并开始运行
MyThread myThread = new MyThread();
myThread.start();
3.或者声明一个实现 Runnable接口的类, 该类然后实现 run 方法, 然后可以分配类的实例,在创建 Thread时作为参数传递,然后启动
class MyThread implements Runnable{
public void run(){}
}
4.然后创建一个线程并开始运行
MyThread myThread =new MyThread();
new Thread(myThread).start();
2.关于线程的生命周期
当你用new Thread()方法创建了一个线程,创建完成之后线程就进入就绪状态(Runnable),此时线程进入抢占CPU资源状态,当线程抢到CPU的执行权之后进入运行状态(Running),当线程完成后或者其他原因调用了stop()方法,线程就进入到死亡状态。还有几种情况下会造成线程阻塞,第一种是当线程主动调用sleep()方法时。还有当线程主动调用阻塞时的io方法。还有一种情况是线程在等待某个通知时会进入阻塞状态。
3.单线程和多线程
1.单线程顾名思义就是一条线程进行执行任务·
2.多线程就是多个线程同时执行任务,多线程具有并行性,更高的运行效率。
4.线程池
在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在Java中,内存资源是及其宝贵的,所以,我们就提出了线程池的概念。
线程池:Java中开辟出了一种管理线程的概念,这个概念叫做线程池,从概念以及应用场景中,我们可以看出,线程池的好处,就是可以方便的管理线程,也可以减少内存的消耗。
5.线程安全
1.临界资源问题:多个线程同时访问相同的资源并进行读写操作。
解决思路:避免竞态条件,多线程同步,必须获得每一个线程对象的锁(lock)。
2.死锁:死锁也是一种因为对资源争夺而出现的状态,是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们将一直互相等待而无法推进下去。因此要解决死锁,尽量避免对同一资源的剥夺,请求和保持,避免循环等待。