多线程的所有操作方法基本上都在Thread类之中定义的,所以研究方法也就是一个Thread类的翻译,那么下面主要看三组方法。
一、命名和取得
在整个多线程的操作之中,名称是最重要的,因为多线程的运行状态是不确定的,那么系统只能够根据名字来判断出是那一个线程,所以在为线程命名的时候不要有重复,更不要修改。
在Thread类里面提供了如下的几个方法进行名称操作:
- 构造方法:public Thread(Runnable target, String name);
- 设置名字:public final void setName(String name);
- 取得名字:public final String getName()。
问题是线程的运行状态不确定,所以要想取得线程的名字,只能够取得当前正在执行的线程。那么在这种情况下如果要想取得当前的线程对象,就必须依靠Thread类的方法:public static Thread currentThread()。
范例:取得线程名字
class MyThread implements Runnable { @Override public void run() { // 线程的主方法 System.out.println(Thread.currentThread().getName()); } } public class TestDemo { public static void main(String[] args) { MyThread mt = new MyThread(); new Thread(mt).start(); new Thread(mt).start(); new Thread(mt, "带名字").start(); } }
发现此时如果设置了线程名称,那么就返回设置的数据。如果没有设置线程名字会自动的进行命名,以保证每一个线程一定有一个名字。
范例:观察如下代码
class MyThread implements Runnable { @Override public void run() { // 线程的主方法 System.out.println(Thread.currentThread().getName()); } } public class TestDemo { public static void main(String[] args) { MyThread mt = new MyThread(); new Thread(mt, "自定义线程").start(); mt.run(); // 主方法之中进行方法调用 } }
现在发现通过“mt.run()”执行的时候取得的线程名称是main,所以可以得出结论:主方法也是一个线程,而新的问题就出现了,一直在讨论线程,但是线程依附于进程,进程在那里啊?
每当用户使用java命令解释一个类的时候,对操作系统而言,都会默认启动一个java的进程,而主方法只是这进程之中的一个线程而已。
问题:每一个JVM运行时至少启动几个线程呢?
至少启动两个线程:主线程、GC垃圾回收线程。
二、休眠
线程的休眠指的是让程序暂缓执行,休眠方法:public static void sleep(long millis) throws InterruptedException;
范例:观察休眠
class MyThread implements Runnable { @Override public void run() { // 线程的主方法 for (int x = 0; x < 100; x++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ",x = " + x); } } } public class TestDemo { public static void main(String[] args) { MyThread mt = new MyThread(); new Thread(mt, "线程A").start(); new Thread(mt, "线程B").start(); new Thread(mt, "线程C").start(); new Thread(mt, "线程D").start(); new Thread(mt, "线程E").start(); } }
由于线程资源的间隔太短,那么可以简单的理解为:多个线程有可能会同时进入到方法执行。
三、线程优先级
从理论上讲线程的优先级越高,越有可能先执行。但是这也只是可能,如果要想进行线程的优先级操作,可以使用如下的两个方法:
- 设置优先级:public final void setPriority(int newPriority);
- 取得优先级:public final int getPriority()。
对于优先级在Thread类之中定义了三个常量:
- 最高优先级:public static final int MAX_PRIORITY,10;
- 中等优先级:public static final int NORM_PRIORITY,5;
- 最低优先级:public static final int MIN_PRIORITY,1。
范例:观察优先级改变
class MyThread implements Runnable { @Override public void run() { // 线程的主方法 for (int x = 0; x < 20; x++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ",x = " + x); } } } public class TestDemo { public static void main(String[] args) { MyThread mt = new MyThread(); Thread t1 = new Thread(mt, "线程A"); Thread t2 = new Thread(mt, "线程B"); Thread t3 = new Thread(mt, "线程C"); t1.setPriority(Thread.MIN_PRIORITY); t3.setPriority(Thread.MAX_PRIORITY); t1.start(); t2.start(); t3.start(); } }
问题:请问主线程的优先级是多少呢?
public class TestDemo {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getPriority());
}
}
主线程只是个中等优先级。