关于进程和线程 在分布式课程里有下面的内容(todo)
并发行和并行性是两个概念:
并行指在同一时刻多条指令在多个处理器上同时执行。并行性指同一时刻只有一条指令执行,但多个进程指令被快速轮换执行,使得宏观上具有多个进程同时执行的效果。
线程和进程:
线程是进程的组成部分。线程是独立运行的,抢占式的。可以与其他线程共享父进程的共享变量及部分环境。
线程的创建和启动:
方法一:继承Thread类创建线程类 public class ** extends Thread
new **().start();新建线程
run()和start()方法:run()的方法体就是线程执行体。调用线程对象的start()方法来启动该线程。main()方法体是java程序运行时的默认主线程。
当线程类继承Thread类时,可以直接时用this即可获得当前线程。getName()即返回当前线程的名字
方法二:实现Runnable接口创建线程类public class ** implements Runnable
** * =new**();
new Thread(*,"name").start();来创建线程。
如果想获得当前线程,只能用Thread.currentThread()方法。Thread.currentThread().getName()。
采用这种方法创建的多个线程可以共享线程类的实例属性。
线程的生命周期:
新建(new)、就绪(Runnable)、运行(running)、阻塞(Blocked)、死亡(Dead)
启动线程的正确方式是start方法,而不能直接调用run方法。通过start()启动后线程也并非立即执行,而是就绪。什么时候启动由jvm决定,随机的。
isAlive()方法可以检测某个线程是否死亡。已经死亡的线程无法再次运行。
控制线程:
join线程:main线程调用了jt线程的join()方法,main线程必须等jt执行结束才会向下执行。
后台线程(守护线程):在后台运行,为其他线程提供服务。如果所有的前台线程都死亡,后台线程会自动死亡。
sleep:让当前正在执行的线程暂停一段时间,并进入阻塞状态。
yield:线程让步。将当前正在执行的线程暂停,进入就绪状态。两个线程的优先级相同时,线程调用yield()方法会将执行机会让给优先级相同的其他线程。如果优先级不同,高优先级的线程调用此方法,该线程继续执行。
改变线程优先级:setPriority(1~10)10的优先级最高。
线程同步:
run()方法的方法体不具有同步安全性。java引入了同步监视器来解决这个问题。synchronized(obj){}
在run()方法中放入此函数,此函数中放入同步代码块。逻辑为“加锁->修改->释放锁”,任何时刻只有一个线程可以获得对同步监视器的锁定。也可以同步方法,用synchronized关键字修饰,方法直接在run中调用。
lock锁:常用的ReentrantLock(可重用锁),lock.lock()加锁,在finally{lock.unlock();}释放锁。
死锁:在系统中出现多个同步监视器的情况下,程序很容易出现死锁,即两个线程互相等待对方释放同步监视器。
线程通信:
传统的:wait(),notify(),notifyAll();不能用于Lock保证的同步。
Condition类:await(),signal(),signalAll()
使用阻塞队列控制线程通信。
线程组和线程池:线程组便于管理,线程池减少与操作系统的交互 减少系统开销