1、进程是系统进行资源分配和调度的一个独立单位,线程是cup调度和分配的基本单位。一个线程只能属于一个进程,一个进程可以拥有多个线程。进程拥有资源,线程不拥有资源,一个进程中的多个线程可以访问共享该进程中的所有资源。
2、线程状态:
①就绪状态:调用线程的start()方法,使线程进入就绪状态,就绪状态就是等待程序分配CPU资源给这个线程运行。
②运行状态:调用run()方法,程序分配cpu资源给该线程,该线程正在运行。
③阻塞状态:线程正在等待某个条件符合或某个事件的发生,才会具备运行条件。sleep()方法。
3、线程的创建和使用。
①继承Thread类,重写run()方法,一个线程的核心代码就在run()方法里面。当通过创建这个线程类的实例,调用strat()就会自动的执行run()方法里面的内容。
②实现Runnable接口,重写run()方法,将核心代码放进去,然后创建Thread thread =new Thread(实现接口的类的对象)的实例,通过构造函数来创建线程。
4、终止线程
①run()方法执行完毕后线程终止。
②线程抛出Exception或者Error且未被捕获。
③调用stop()方法,该方法已被废弃。
5、线程等待和中断等待
sleep()可以让当前线程进入等待(阻塞)状态,直到指定的时间流逝,或者调用interrupt()方法中断当前线程的等待,让当前线程进入就绪状态。
6、等待其他线程完成。
join()该方法等待其他线程的完成,然后再执行完该线程。
7、设置线程优先级
线程的优先级从1到10,默认是5,推荐1、5、10
setPriority(Thread.MIN_PRIORITY);为1
setPriority(Thread.MAX_PRIORITY);为10
设置优先级,并不能保证优先级高的先运行,只是给操作系统提供一个建议。
yield()方法当前线程放弃资源回到就绪状态,使其他优先级不低于此线程的线程有机会被执行。
8、多线程同步
线程不同步可能会出现共享数据被不同的线程存取,出现数据不一致的情况,多线程同步的好处是避免了这种情况,但是也会带来性能的问题,不能并行处理。实现线程同步有两种方法分别如下:
①同步代码块:让多线程去竞争一个共享的对象锁
synchronized(obj){
//同步代码快
}
②同步方法:
public void run(){
test();
}
public static synchronized void test(){
}
9、线程死锁
两个线程互相等待对方释放锁时就会发生死锁。出现死锁后,不会出现异常,不会提示,只是相关的线程都处于阻塞状态,无法继续运行。多个线程以同样的顺序获取锁,不出现交叉也就不会出现死锁的问题。
10、线程协作
wait():当前线程等待,等待其他线程调用此对象的notify()方法或者notify()方法将其唤醒。
notify():唤醒此对象锁上等待的单个线程。
notifyAll():唤醒此对象锁上的所有等待的线程。