概述
No. | 方法名称 | 类型 | 描述 |
1 | public Thread(Runnable target) | 构造 | 接收Runnable接口子类对象,实例化Thread对象 |
2 | public Thread(Runnable target,String name) | 构造 | 接收Runnable接口子类对象,实例化Thread对象,并设置线程名称 |
3 | public Thread(String name) | 构造 | 实例化Thread对象,并设置线程名称 |
4 | public static Thread currentThread() | 普通 | 返回目前正在执行的线程 |
5 | public final String getName() | 普通 | 返回线程的名称 |
6 | public final int getPriority() | 普通 | 发挥线程的优先级 |
7 | public boolean isInterrupted() | 普通 | 判断目前线程是否被中断,如果是,返回true,否则返回false |
8 | public final boolean isAlive() | 普通 | 判断线程是否在活动,如果是,返回true,否则返回false |
9 | public final void join() throws InterruptedException | 普通 | 等待线程死亡 |
10 | public final synchronized void join(long millis) throws InterruptedException | 普通 | 等待millis毫秒后,线程死亡 |
11 | public void run() | 普通 | 执行线程 |
12 | public final void setName(String name) | 普通 | 设定线程名称 |
13 | public final void setPriority(int newPriority) | 普通 | 设定线程的优先值 |
14 | public static void sleep(long millis) throws InterruptedException | 普通 | 使目前正在执行的线程休眠millis毫秒 |
15 | public void start() | 普通 | 开始执行线程 |
16 | public static void yield() | 普通 | 将目前正在执行的线程暂停,允许其它线程执行 |
17 | public final void setDaemon(boolean on) | 普通 | 将一个线程设置成后台运行 |
18 | public final void setPriority(int newPriority) | 普通 | 更改线程的优先级 |
了解设置和取得线程名称
- 在Thread类中,可以通过getName()方法取得线程的名称,通过setName()方法设置线程的名称。
- 线程的名称一般在启动线程前设置,但也允许为已经运行的线程设置名称。允许两个Thread对象有相同的名字,但为了清晰,应该尽量避免这种情况的发生。
- 另外,如果程序并没有为线程指定名称,则系统会自动的为线程分配一个名称。
package com.dong1990;
public class fifth {
public static void main(String args[]) {
MyThread my = new MyThread() ; // 定义Runnable子类对象
new Thread(my).start() ; // 系统自动设置线程名称
new Thread(my,"线程-A").start() ; // 手工设置线程名称
new Thread(my,"线程-B").start() ; // 手工设置线程名称
new Thread(my).start() ; // 系统自动设置线程名称
new Thread(my).start() ; // 系统自动设置线程名称
}
}
class MyThread implements Runnable { // 继承Thread类
public void run(){ // 覆写接口中的run()方法
for(int i=0;i<3;i++){ // 循环输出3次
System.out.println(Thread.currentThread().getName()
+ "运行, i = " + i) ; // 取得当前线程的名字
}
}
}
从运行结果中发现没有设置线程名称的其余三个线程对象的名字都是很有规律的:Thread-0、Thread-1、Thread-2,从之前讲解的static关键字可以知道,在Thread类中必然存在一个static类型的属性,用于为线程自动命名。
观察程序的输出
通过Thread类之中的start()方法通知CPU这个线程已经准备好启动,之后就等待分配CPU资源,运行此线程了。那么如何判断一个线程是否已经启动了呢?在Java中可以使用isAlive()方法来测试线程是否已经启动而且仍然在启动。
package com.dong1990; public class fifth { public static void main(String args[]) { MyThread mt = new MyThread(); // 实例化对象 Thread t = new Thread(mt, "线程"); // 实例化Thread对象 System.out.println("线程开始执行之前 --> " + t.isAlive());// 判断是否启动 t.start(); // 启动线程 System.out.println("线程开始执行之后 --> " + t.isAlive());// 判断是否启动 for (int i = 0; i < 3; i++) { // 循环输出3次 System.out.println(Thread.currentThread().getName()+" 运行 --> " + i); // 输出 } System.out.println("代码执行之后 --> " + t.isAlive());// 后面的输出结果不确定 } } class MyThread implements Runnable { // 继承Thread类 public void run(){ // 覆写接口中的run()方法 for(int i=0;i<3;i++){ // 循环输出3次 System.out.println(Thread.currentThread().getName() + "运行, i = " + i) ; // 取得当前线程的名字 } } }
Thread.currentThread().getName()是用于获取“当前线程”的名字。当前线程是指正在cpu中调度执行的线程。
了解线程的强制运行
在线程操作中,可以使用join()方法让一个线程强制运行,线程强制运行期间,其他线程无法运行,必须等待此线程完成之后才可以继续执行。
package com.dong1990;
public class fifth {
public static void main(String args[]) {
MyThread mt = new MyThread(); // 实例化对象
Thread t = new Thread(mt, "线程"); // 实例化Thread对象
t.start(); // 线程启动
for (int i = 0; i < 50; i++) { // 循环50次
if (i > 4) { // 判断变量内容
try {
t.join(); // 线程t进行强制运行
} catch (Exception e) {} // 需要进行异常处理
}
System.out.println(Thread.currentThread().getName()+" 线程运行 --> " + i);
}
}
}
class MyThread implements Runnable { // 继承Thread类
public void run(){ // 覆写接口中的run()方法
for(int i=0;i<10;i++){ // 循环输出3次
System.out.println(Thread.currentThread().getName()
+ "运行, i = " + i) ; // 取得当前线程的名字
}
}
}
了解线程的休眠
在程序中允许一个线程进行暂时的休眠,直接使用Thread.sleep()方法即可。
package com.dong1990;
public class fifth {
public static void main(String args[]) {
MyThread mt = new MyThread(); // 实例化对象
new Thread(mt, "线程").start();
}
}
class MyThread implements Runnable { // 继承Thread类
public void run(){ // 覆写接口中的run()方法
for (int i = 0; i < 5; i++) { // 循环5次
try {
Thread.sleep(500); // 线程休眠
} catch (Exception e) {} // 需要异常处理
System.out.println(Thread.currentThread().getName()
+ "运行, i = " + i); // 输出线程名称
}
}
}
了解线程的礼让
在线程操作中,也可以使用yield()方法将一个线程的操作暂时让给其他线程执行。
package com.dong1990;
public class fifth {
public static void main(String args[]) {
MyThread my = new MyThread() ; // 实例化MyThread对象
Thread t1 = new Thread(my, "线程A") ; // 定义线程对象
Thread t2 = new Thread(my, "线程B"); // 定义线程对象
t1.start() ; // 启动多线程
t2.start() ; // 启动多线程
}
}
class MyThread implements Runnable { // 继承Thread类
public void run(){ // 覆写接口中的run()方法
for (int i = 0; i < 10; i++) { // 不断输出
System.out.println(Thread.currentThread().getName() + "运行 --> " + i); // 输出线程名称
if (i == 3) {
System.out.print("线程礼让:");
Thread.currentThread().yield() ; // 线程礼让
}
}
}
}
了解线程的中断操作
当一个线程运行的时候,另外一个线程可以直接通过interrupt()方法,中断其运行状态。
package com.dong1990;
public class fifth {
public static void main(String args[]) {
MyThread mt = new MyThread(); // 实例化子类对象
Thread t = new Thread(mt, "线程"); // 实例化线程对象
t.start();
try {
Thread.sleep(2000); // 稍微停2秒再继续中断
} catch (Exception e) {
}
t.interrupt(); // run方法中休眠十秒,这里直接在两秒的时候把t线程中断,run会异常,捕捉异常,并return到程序调用处
}
}
class MyThread implements Runnable { // 继承Thread类
public void run(){ // 覆写接口中的run()方法
System.out.println("1、进入run方法");
try {
Thread.sleep(10000); // 休眠10秒
System.out.println("2、已经完成休眠");
} catch (Exception e) {
System.out.println("3、休眠被终止");
return; // 让程序返回被调用处
}
System.out.println("4、run方法正常结束");
}
}
线程的优先级
在Java的线程操作中,所有的线程在运行前都会保持在就绪状态,那么此时,那个线程的优先级高,那个线程就有可能会先被执行。
No. | 定义 | 描述 | 表示的常量 |
1 | public static final int MIN_PRIORITY | 最低优先级 | 1 |
2 | public static final int NORM_PRIORITY | 中等优先级,是线程的默认优先级 | 5 |
3 | public static final int MAX_PRIORITY | 最高优先级 | 10 |
package com.dong1990;
public class fifth {
public static void main(String args[]) {
Thread t1 = new Thread(new MyThread(),"线程A"); // 实例化线程对象
Thread t2 = new Thread(new MyThread(),"线程B"); // 实例化线程对象
Thread t3 = new Thread(new MyThread(),"线程C"); // 实例化线程对象
t1.setPriority(Thread.MIN_PRIORITY) ; // 设置线程优先级为最低
t2.setPriority(Thread.MAX_PRIORITY) ; // 设置线程优先级为最高
t3.setPriority(Thread.NORM_PRIORITY) ; // 设置线程优先级为中等
t1.start() ; // 启动线程
t2.start() ; // 启动线程
t3.start() ; // 启动线程
}
}
class MyThread implements Runnable { // 继承Thread类
public void run(){ // 覆写接口中的run()方法
for (int i = 0; i < 5; i++) { // 循环5次
try {
Thread.sleep(500); // 线程休眠
} catch (Exception e) {} // 需要异常处理
System.out.println(Thread.currentThread().getName()
+ "运行, i = " + i); // 输出线程名称
}
}
}
最后
以上就是勤奋大船为你收集整理的多线程(二) —— 线程常用操作方法了解设置和取得线程名称了解线程的强制运行 了解线程的休眠了解线程的礼让 了解线程的中断操作的全部内容,希望文章能够帮你解决多线程(二) —— 线程常用操作方法了解设置和取得线程名称了解线程的强制运行 了解线程的休眠了解线程的礼让 了解线程的中断操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复