1、线程的状态:创建,可运行,运行,阻塞,死亡。thread类的方法改变状态,new创建,start可运行状态,运行中执行run方法,阻塞(io阻塞,休眠,锁定等待消息),死亡。
2、其他通用方法:
sleep。使线程进入睡眠状态。public static void sleep(long millis) throws InterruptedException.参数为指定的睡眠时间。注意InterruptedException。调用方法后进入不可运行状态,时间过后进入可运行状态。
yield。静态方法。暂停线程的yield方法。线程处于可运行状态,同优先级的线程先执行,若无则执行。不去阻塞线程,使线程进入就绪状态。让系统的线程调度重新调度一次。大部分情况下,调用yield方法后,线程调度器又将其调出来执行。
sleep与yield的区别在于,sleep暂停当前线程后,给其他线程机会,而yield只给优先级大于等于的线程机会。sleep使线程进入阻塞状态。sleep方法需要显示声明抛出或捕捉interruptedException.yield方法没有声明异常。
join。使线程暂停。public final void join(long millis) throws InterruptedException.使线程暂停,直到调用该方法的线程执行完再执行本线程。
wait。使当前线程进入阻塞状态。对于notify,notifyall方法,唤醒等待队列中的线程使之进入可运行状态。
interrupt。为线程设置一个中断标记,使线程进入sleep状态。?若调用interrupt方法需要捕获interruptException异常?。run方法运行时候用public void isInterrupted方法检测。
3、线程的优先级调度。最低优先级为1,最高为10,默认为5.public final setPriority(int newPriority)设置优先级。getPriority获取优先级。线程调度负责线程的排队和CPU在线程间的调度。优先级高的总是先执行,即使有线程在执行也会中断其执行。同优先级的有两种方式,一种是分时,一种是独占到执行完。
4、线程组。把多个线程组成一个对象,对线程组的操作即为对所有线程的操作。线程组可创建线程组。最高的组为main线程组。
public ThreadGroup(String name)创建名为name的线程组。
public ThreadGroup(ThreadGroup parent , String name)在parent下创建一个名字为name的线程组。
5、线程的同步机制。进程划分为线程为了得到更高的效率,但是对同一数据操作会产生问题。同步机制:对于共享数据互相锁定。任何时候只有一个线程能对其操作,保证数据的一致性。共享数据的互相锁定synchronized关键字,将一段程序和方法锁定在一个对象上,方法程序对于对象的操作不中断。
该日志指明的概念较为抽象,在笔记本上有一页没有懂,需要额外再处理。
6、单线程的程序只有单一顺序执行流,多线程有多个顺序执行流。多个顺序流互相不干扰。多个顺序执行流提高效率。?线程池为了提高多线程的性能?。并发是同一时刻只有一条指令,多个进程指令快速切换,在宏观上具有多个进程同时执行的效果。线程是进程的执行单元。一个线程必须有父线程。与父线程的其他线程共享所有进程的全部资源,编程方便,但是要确认不影响同一进程下的其他线程。线程执行是抢占式。线程共享的资源包括进程的代码段和共有数据。进程内存不共享,线程共享。创建进程需要额外的分配系统资源,创建线程代价小。
7、线程进入阻塞状态:1调用sleep方法主动放弃占用资源。2调用io阻塞方法,方法返回前,线程被阻塞。3等待某个通知notify。4使用suspend方法把线程挂起,容易死锁避免使用。相应的,线程解除阻塞状态:1sleep方法过了指定时间。2调用阻塞式io有了返回值。3、线程等待通知的时候,其他线程发来了通知。4、处于挂起的线程被调用了resume方法。
8、线程的同步。多线程引入监视器来解决多个线程修改同一个文件引发异常的问题。使用同步代码块。synchronized,推荐使用可能被并发访问的资源充当监视器。任何时候只有一个线程才能获得同步监视器的锁定。加锁-修改-释放锁。任何线程在修改资源前,对资源加锁,使其他资源无法修改该资源。保证线程安全。
使用同步锁lock,较synchronize灵活。lock用于控制多个线程对共享资源进行访问的工具,锁对共享资源的独占访问,每次只有一个线程对lock对象加锁,线程开始访问共享资源前获得lock对象。
感觉对于很多上面提到的方法没有代码操练十分有问题。