多线程的所有操作方法基本上都在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());
}
}
主线程只是个中等优先级。