多线程的所有操作方法基本上都在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());
	}
}

主线程只是个中等优先级。