Java中多线程线程的控制及常用方法

2022-07-31 13:57:32

Java中多线程线程的控制及常用方法

一、线程的控制方法

1、休眠线程

使用sleep()方法来使当前线程休眠,不再向下执行。该方法是Thread的静态方法:
public static voidsleep(long millis) throwsInterruptedException
millis - 以毫秒为单位的休眠时间。
public static voidsleep(long millis, int nanos) throwsInterruptedException
millis - 以毫秒为单位的休眠时间。
nanos - 要休眠的另外 0-999999 纳秒。

2、加入线程

使用join()方法来使其他线程等待调用了join()方法的对象(线程)先执行。该方法属于Thread对象的方法:
public final voidjoin() throwsInterruptedException
等待该线程终止。直到该线程执行完成后其他线程才执行。
public final voidjoin(long millis, int nanos) throwsInterruptedException
等待该线程终止的时间最长为millis 毫秒 +nanos 纳秒。
millis - 以毫秒为单位的等待时间。
nanos - 要等待的 0-999999 附加纳秒。
public final voidjoin(long millis) throwsInterruptedException
    等待该线程终止的时间最长为millis 毫秒。超时为0 意味着要一直等下去。
millis - 以毫秒为单位的等待时间。

3、礼让线程

使用yield()方法来使暂停当前正在执行的线程对象,来执行其他线程。该方法是Thread的静态方法:
public static voidyield()
暂停当前正在执行的线程对象,并执行其他线程。

4、守护线程(用户线程)

使用setDaemon()方法使调用该方法的对象被标记为守护线程。守护线程在其他线程终止后也会终止。当正在运行的所有线程都是守护线程时JAVA虚拟机会退出。
public final voidsetDaemon(boolean on)
将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。

该方法必须在启动线程前调用。

该方法首先调用该线程的checkAccess 方法,且不带任何参数。这可能抛出SecurityException(在当前线程中)。

参数:
on - 如果为true,则将该线程标记为守护线程。
示例如下:
package com.example.thread.one;

public class ThreadDemo {
	public static void main(String[] args) {
		MyThread mThread1 = new MyThread();
		MyThread mThread2 = new MyThread();
		//为线程设置名称
		mThread1.setName("守护1");
		mThread2.setName("守护2");
		//将两个线程都设置为守护线程.这个设置必须在启动线程前调用。
		mThread1.setDaemon(true);
		mThread2.setDaemon(true);
		//启动两个守护线程
		mThread1.start();
		mThread2.start();
		
		//当前线程,也就是main线程,为守护线程
		Thread.currentThread().setName("被守护的线程");
		for (int i = 0; i < 5; i++) {
			System.out.println(Thread.currentThread().getName() + " :" + i);
		}
	}
}

class MyThread extends Thread{
	@Override
	public void run() {
		super.run();
		for (int i = 0; i < 100; i++) {
			System.out.println(getName() + " :" + i);
		}
	}
}

当被守护的线程执行完后,两个守护线程不会将循环执行完,而是随着被守护线程执行完成也终止循环。

5、终止线程(中断线程)

使用interrupt()方法来中断线程。该方法属于Thread对象的方法:
public voidinterrupt()
中断线程。

如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的checkAccess 方法就会被调用,这可能抛出SecurityException

如果线程在调用Object 类的wait()wait(long)wait(long, int) 方法,或者该类的join()join(long)join(long, int)sleep(long)sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个InterruptedException

如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个ClosedByInterruptException

如果该线程在一个Selector 中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的wakeup 方法一样。

如果以前的条件都没有保存,则该线程的中断状态将被设置。

中断一个不处于活动状态的线程不需要任何作用。

抛出:
SecurityException - 如果当前线程无法修改该线程
public booleanisInterrupted()
测试线程是否已经中断。线程的中断状态 不受该方法的影响。

线程中断被忽略,因为在中断时不处于活动状态的线程将由此返回 false 的方法反映出来。

返回:
如果该线程已经中断,则返回true;否则返回false

6、其他常用方法

public staticThreadcurrentThread()
返回对当前正在执行的线程对象的引用。

返回:

当前执行的线程。

public finalStringgetName()
返回该线程的名称。
返回:
该线程的名称。
public final voidsetName(String name)
改变线程名称,使之与参数name 相同。

首先调用线程的checkAccess 方法,且不带任何参数。这可能抛出SecurityException

参数:
name - 该线程的新名称。
抛出:
SecurityException - 如果当前线程不能修改该线程。
public final intgetPriority()
返回线程的优先级。
返回:
该线程的优先级。
public final voidsetPriority(int newPriority)
更改线程的优先级。未设置时默认为5.

首先调用线程的checkAccess 方法,且不带任何参数。这可能抛出SecurityException

在其他情况下,线程优先级被设定为指定的newPriority 和该线程的线程组的最大允许优先级相比较小的一个。

参数:
newPriority - 要为线程设定的优先级
抛出:
IllegalArgumentException - 如果优先级不在MIN_PRIORITY(1)MAX_PRIORITY(10) 范围内。
SecurityException - 如果当前线程无法修改该线程。
public finalThreadGroupgetThreadGroup()
返回该线程所属的线程组。 如果该线程已经终止(停止运行),该方法则返回 null。
public final booleanisAlive()
测试线程是否处于活动状态。如果线程已经启动且尚未终止,则为活动状态。
返回:
如果该线程处于活动状态,则返回true;否则返回false
publicStringtoString()
返回该线程的字符串表示形式,包括线程名称、优先级和线程组。
覆盖:
Object 中的toString
返回:
该线程的字符串表示形式。
  • 作者:OONullPointerAlex
  • 原文链接:https://blog.csdn.net/OONullPointerAlex/article/details/50907866
    更新时间:2022-07-31 13:57:32