java学习线程篇之多线程的常用操作方法
1. 线程的命名与取得
所有的线程程序的执行,每一次都是不同的运行结果,因为它会根据自己的情况进行资源抢占。所以如果要想区分每一个线程,就必须依靠线程的名字。对于线程的名字在启动之前进行定义,不建议更改已经启动的线程的名称或为不同的线程设置相同名称。
如果要想进行线程名称的操作,可以使用Thread类的如下方法:
- 构造方法
Thread(Runnable target, String name)
- setName方法,利用final定义,表示不能被覆写
public final void setName(String name)
public final String getName()
对于线程名字的操作会出现一个问题,这些方法是属于Thread类里面的,可是如果换回到线程类(Runnable子类),这个子类里面并没有继承Thread类,如果要想取得线程的名称,那么能够取得的就是当前执行本方法的线程名字。所以在Thread类里面提供了一个方法:
- 取得当前线程对象:
如果在实例化Thread类对象的时候没有为其设置名字,那么会自动的进行编号命名,也就是保证线程对象命名不重复。
原来主方法就是一个线程(main线程),那么所有在方法上创建的线程实际上都可以将其表示为子线程。
线程实际上一直都存在,可是进程去哪里了呢?
每当使用java命令去解释一个程序类的时候,对于操作系统而言都相当于启动了一个新的进程,而main只是这新进程上的一个子线程而已。
提问:每一个JVM进程启动的时候至少启动几个线程?
两个。
- main线程,程序的主要执行以及启动子线程;
- gc线程:负责垃圾收集。
2. 线程的休眠
所谓的线程休眠就是让线程的执行速度稍微变慢一点。休眠的方法:
public static void sleep(long millis,
int nanos)
throws InterruptedException
默认情况下,在休眠时如果设置了多个线程对象,那么所有的线程对象将一起进入run()方法。所谓的一起进入是因为先后顺序实在太短了,但实际上是有区别的。
3. 线程优先级
所谓的优先级指的是越高的优先级,越有可能先执行。
在Thread类里面提供有以下两个方法进行优先级操作:
- 设置优先级
public final void setPriority(int newPriority)
- 取得优先级
public final int getPriority()
设置和取得优先级的返回值都是int类型,对于此内容有三种取值:
提问:主线程的优先级是多少?
主线程属于中等优先级。
4. 总结
- Thread.currentThread()可以取得当前线程类对象;
- Thread.sleep()主要是休眠,感觉多个线程是一起休眠,但实际上是有先后顺序的;
- 优先级越高的线程对象越有可能先执行。