Java多线程编程学习与思忖
因为工作关系,最近在猛看Java多线程编程的资料。以前因为做的是J2EE项目,也未曾编写过多线程的东西,很多三、四年前初学Java的概念都忘记了。现在重新拾起。
Java多线程
Java线程运行的状态:
Java虚拟机将线程运行的过程分为四种状态:
New ----新生
Runnable ----可运行
Blocked ----阻塞
Dead ----死亡
注意:在很多操作系统中,线程的状态远不止这四种。
Java线程的创建:
在Java中实现多线程是通过继承java.lang.Thread 类 和 实现 java.lang.Runnable接口实现的。
Runnable接口只有一个run()方法。
继承自Thread类的子类必须覆盖Thread类的run()方法以实现自己的操作。
线程的启动:
通过调用Thread类的start()方法来启动一个线程,而不是通过run()方法。
run()方法是线程的执行体,所有的线程执行代码都在run()方法中实现。
实现了Runnable接口的线程没有start()方法,它通过以下的方式来启动自己。
//实现Runnable接口的线程的启动方式 Runnable r = new RunnableImpl(); Thread thread= new Thread(r); thread.start();
线程的优先级:
线程的优先级与创建它的线程的优先级相同。
通过如下方法可以设置线程的优先级:
//手动设置线程的优先级 public final void setPriority(int newPriority)
注意:手动设置线程的优先级是个危险地操作。必须考虑具体的操作系统平台。因为操作系统对优先级的支持不同,在windows NT/XP 线程有7个优先级,而在很多Linux系统中却没有设置优先级调度策略。因此,Java为Linux提供的虚拟机在优先级上完全被忽略了。所有线程具有相同的优先级。
线程的分类:
Java线程分为两类:User Thread (用户线程)、Daemon Thread(守护线程)
下面的方法是用来设置守护线程的:
//设置线程为守护线程 public final void setDaemon (boolean on);
注意:setDaemon(boolean on) 方法必须在 start()方法之前设置,否则会抛出一个java.lang.IllegalThreadStateException 异常。
不能将一个正在运行的常规线程设置为守护线程。
守护线程中产生的线程也是守护线程。
Thread.sleep() 方法
使当前线程阻塞一定时间将CPU时间让给其他线程,会释放锁,并重新到可运行状态(即Runnable状态),重新等待获得CPU时间以执行在sleep时未执行完的代码;
wait()方法
使当前正在执行的线程阻塞,并释放锁,状态变为Blocked(阻塞状态);
interrupt()方法
中断一个正在执行的线程,但只是将该正在执行的线程的中断标志位更改,该正在运行的线程是否会中断由它自己决定。也就是说有可能中断,也可能一直运行直到完毕。
正在执行的线程可以通过Thread.currentThread().isInterrupted()方式来判断是否有线程试图中断自己的运行,以便决定是否进行处理。
public static void yield()方法
线程间通信:
通过管道来实现。管道又分为命名管道和无名(或匿名)管道。命名管道可以方便的在两个独立进程之间实现通信;匿名管道是父子进程之间通信的一种方式。
Java多线程中的管道是通过Java提供的工具类来实现的。
Java多线程的管道工具类:
java.io.PipedInputStream;
java.io.PipedOutputStream;