Java多线程:Thread深入研究
介绍
Thread类由其名字可知其是一个线程类,java创建线程可以通过该类.
A thread is a thread of execution in a program. The Java Virtual Machine allows an application
to have multiple threads of execution running concurrently.
备注:Thread类实现了Runnable接口.
Thread类常用静态方法
//返回当前线程的线程组中活动线程的数目
public static int activeCount();
//返回对当前正在执行的线程对象的引用
public static native Thread currentThread();
//测试当前线程是否已经中断
public static boolean interrupted()
//在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),是要释放资源的
public static native void sleep(long millis)
//在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),是要释放资源的
public static void sleep(long millis, int nanos)
//暂停当前正在执行的线程对象,并执行其他线程.
public static native void yield()
Thread常用普通方法
最核心的两个方法
//启动线程(是有操作系统底层支持的方法)
public synchronized void start()
//需要被覆盖写业务代码的方法
public void run();
//强行抢占CPU资源
public final void join();
public final synchronized void join(long millis)
public final synchronized void join(long millis, int nanos)
//Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever.
//设置线程的优先级(范围在1~10,通常 NORM_PRIORITY = 5)
public final void setPriority(int newPriority) //优先级并不是绝对的能改变执行顺序,最终由操作系统调度
//默认就提供了name属性
public final void setName(String name)
//设置线程为守护线程还是用户线程(This method must be invoked before the thread is started.)
public final void setDaemon(boolean on)
//判断线程是否被打断
public boolean isInterrupted()
//判断线程是否存活
public final native boolean isAlive()
还有一系列的构造方法
public Thread()
public Thread(Runnable target)//常用
public Thread(Runnable target, String name)//常用
public Thread(ThreadGroup group, Runnable target)
. . .
废弃方法
//以下三个是过时方法,不推荐使用
public final void stop()//该方法具有固有的不安全性
public void destroy()//该方法最初用于破坏该线程,但不作任何清除
public final void suspend()//该方法已经遭到反对,因为它具有固有的死锁倾向。
那么该如何停止一个线程呢?使用标识位来判断,退出run代码块。
关于启动线程理解
线程的最终启动是依赖操作系统的,而非普通的java方法就能启动.
线程的执行是需要获得CPU执行权才能够执行,而线程是通过抢占式获得CPU执行权的.
查看start()方法源码
public synchronized void start() {
//如果线程已经启动了就不能再启动,否则报错。
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();//操作系统本地方法,由C/C++编写
started = true;
} finally {
//. . .
}
}
private native void start0();//操作系统本地方法
多线程的随机性和不可预测性
public class ThreadApp {
public static void main(String[] args) {
PrintNumThread printNumThread = new PrintNumThread(10);
printNumThread.setName("test线程");
printNumThread.start();// 该线程一定要先于下面的方法调用
// printNumThread.run();//如果直接调用run方法,那么只是一个普通的调用方法,并没有启动线程来执行run方法。
printNum(10);
}
private static void printNum(int num) {
for (int i = 0; i < num; i++) {
System.out.println(Thread.currentThread().getName() + ":" + (i + 1));
}
}
}
备注:从该例中也能看出,java启动运行时本身就启动了一个主线程.
备注:每次执行的结果都是不同的也是不可预测的.
参考
1、[JDK 文档参考](JDK 文档参考)
2、http://www.cnblogs.com/dolphin0520/p/3920357.html