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

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

一、线程的控制方法

1、休眠线程

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

2、加入线程

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

3、礼让线程

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

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

使用setDaemon()方法使调用该方法的对象被标记为守护线程。守护线程在其他线程终止后也会终止。当正在运行的所有线程都是守护线程时JAVA虚拟机会退出。
public final void setDaemon(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 void interrupt()
中断线程。

如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的 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 boolean isInterrupted()
测试线程是否已经中断。线程的 中断状态 不受该方法的影响。

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

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

6、其他常用方法

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

返回:

当前执行的线程。

public final String getName()
返回该线程的名称。

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

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

参数:
name - 该线程的新名称。
抛出:
SecurityException - 如果当前线程不能修改该线程。
public final int getPriority()
返回线程的优先级。

返回:
该线程的优先级。
public final void setPriority(int newPriority)
更改线程的优先级。未设置时默认为5.

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

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

参数:
newPriority - 要为线程设定的优先级
抛出:
IllegalArgumentException - 如果优先级不在 MIN_PRIORITY(1)MAX_PRIORITY(10) 范围内。
SecurityException - 如果当前线程无法修改该线程。
public final ThreadGroup getThreadGroup()
返回该线程所属的线程组。 如果该线程已经终止(停止运行),该方法则返回 null。 
public final boolean isAlive()
测试线程是否处于活动状态。如果线程已经启动且尚未终止,则为活动状态。

返回:
如果该线程处于活动状态,则返回 true;否则返回 false
public String toString()
返回该线程的字符串表示形式,包括线程名称、优先级和线程组。

覆盖:
Object 中的 toString
返回:
该线程的字符串表示形式。

                
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值