最近把《Java多线程编程核心技术》一书看了一遍,为了让自己更好的理解,写博客记录一下自己得感悟。
Java 提供了三种创建线程的方法:
- 通过实现 Runnable 接口;
- 通过继承 Thread 类本身;
- 通过 Callable 和 Future 创建线程
Thread 方法
序号 | 详解 |
---|---|
1 | public void start() : 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 |
2 | public void run() :如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。 |
3 | public void start() : 改变线程名称,使之与参数 name 相同。 |
4 | public final void setPriority(int priority) :更改线程的优先级。 |
5 | public final void setDaemon(boolean on) :将该线程标记为守护线程或用户线程。 |
6 | public final void join(long millisec) : 等待该线程终止的时间最长为 millis 毫秒。 |
7 | public void interrupt() : 中断线程。 |
8 | public final boolean isAlive() :测试线程是否处于活动状态。 |
Thread的静态方法如下:
序号 | 详解 |
---|---|
1 | public static void yield() : 暂停当前正在执行的线程对象,并执行其他线程。(让步方法) |
2 | public static void sleep(long millisec) :在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响 |
3 | public static Thread currentThread() :返回对当前正在执行的线程对象的引用。 |
停止线程
停止线程是在多线程开发时很重要的一个技术点,停止一个线程以为着在线程处理完任务之前停掉正在做的操作,也就是放弃当前的操作。可以使用Thread.stop()方法,但最好不要用它。虽然它确实可以停止一个正在运行的线程,但这个方法是不安全的。大多数停止一个线程的操作使用Thread.interrupt()方法。
判断线程是否是停止状态
-
this.interrupted():测试当前线程是否已经是中断状态,执行后具有将状态标志清楚为false的功能,为static方法。
-
this.isInterrupted():测试线程Thread对象是否已经是中断状态,但是不清除状态标志。
暂停线程
虽然suspend和resume方法可以分别使得线程暂停和回复,但是这两个方法因为有缺点而已经被弃用。
缺点:
独占:在使用suspend和resume方法时,如果使用不当,极易造成公共的同步对象独占,使得其他线程无法访问公共同步对象。
不同步:在使用suspend与resume方法时也容易因为线程而导致数据不同步的情况。
yield方法
可以使用yield方法进行暂停。
yield()方法的作用是放弃当前的CPU资源,将它让给其他任务去占用CPU执行时间。但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片。
线程优先级
public final void setPriority(int newPriority) 更改线程的优先级。
首先调用线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException。 在其他情况下,线程优先级被设定为指定的 newPriority 和该线程的线程组的最大允许优先级相比较小的一个。
参数:
newPriority - 要为线程设定的优先级
- Thread.MAX_PRIORITY表示线程的最大优先级
- Thread.MIN_PRIORITY表示线程的最小优先级
- Thread.NORM_PRIORITY表示线程的默认优先级
抛出:
IllegalArgumentException - 如果优先级不在 MIN_PRIORITY 到 MAX_PRIORITY 范围内。
SecurityException - 如果当前线程无法修改该线程。
注意:
- 线程优先级从1到10,1是最不重要的,10是最重要的。默认一个线程的优先级为5
- 优先级高低代表的是的每次抢到进程资源的概率.