Java多线程api介绍

2.1 currentThread()方法

currentThread()方法可返回代码段正在被哪个线程调用的信息
public class run {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());
    }
}
注意,Thread.currentThread()和this.currentThread()有些情况下不一定一样。比如说,将线程对象以构造参数的方式传递给Thread对象(引用不同)

2.2 isAlive()方法

isAlive()的功能是判断当前的线程是否处于活动状态(线程处于正在运行或准备开始运行的状态就认为线程是存活的)
public void run()
{
    System.out.println("run " + this.isAlive());
}

2.3 sleep()方法

在指定的毫秒数内让当前'正在执行的线程'休眠(指的是this.currentThread()返回的线程)

2.4 getId()方法

getId方法取得线程的唯一标识.

2.5 停止线程

2.5.1 stop()方法
stop方法可以强制停止一个线程,但是stop方法由于存在安全性已经被淘汰 (强制停止会导致一些清理性的工作得不到完成,另外一张情况是对锁定的对象进行了‘解锁’导致数据得不到同步的处理,出现了数据不一致的问题)

不安全又因为它在终止一个线程时会强制中断线程的执行,不管run方法是否执行完了,并且还会释放这个线程所持有的所有的锁对象。这一现象会被其它因为请求锁而阻塞的线程看到,使他们继续向下执行。这就会造成数据的不一致,我们还是拿银行转账作为例子,我们还是从A账户向B账户转账500元,我们之前讨论过,这一过程分为三步,第一步是从A账户中减去500元,假如到这时线程就被stop了,那么这个线程就会释放它所取得锁,然后其他的线程继续执行,这样A账户就莫名其妙的少了500元而B账户也没有收到钱。这就是stop方法的不安全性。

2.5.2 异常法
2.5.2.1 判断线程是否停止状态

this.interrupted(): 测试当前线程是否已经中断
this.isinterrupted(): 测试线程是否已经中断

2.5.2.2 正确的停止方法
public void run()
{
    try {
        for (int i = 0; i < 50; i++) {
            if (this.isInterrupted()) {
                System.out.println("Thread stoped");
                throw new InterruptedException();
            }
            System.out.println(i);
        }
    }
    catch (Exception e)
    {
        /*
        *  进行清理工作
        */
        e.printStackTrace();
    }
}
注意不要在线程sleep的状态下停止线程,否则会抛异常。

2.6 暂停线程

suspend()和resume()方法,从字面意义上可以了解到这两个方法是一对的,suspend()方法就是将一个线程挂起(暂停),resume()方法就是将一个挂起线程复活继续执行。
2.6.1 使用方法
public static void main(String[] args) throws Exception {
	  DemoThread t = new DemoThread();
	  t.start();
	  Thread.sleep(1000);
	  //让线程挂起
	  t.suspend();
	  Thread.sleep(1000);
	  //回复线程,让线程继续执行
	  t.resume();
	  System.out.println("-----------------");
}
2.6.2 suspend方法被弃用的原因
suspend被弃用的原因是因为它会造成死锁。suspend方法和stop方法不一样,它不会破换对象和强制释放锁,相反它会一直保持对锁的占有,一直到其他的线程调用resume方法,它才能继续向下执行。

假如有A,B两个线程,A线程在获得某个锁之后被suspend阻塞,这时A不能继续执行,线程B在或者相同的锁之后才能调用resume方法将A唤醒,但是此时的锁被A占有,B不能继续执行,也就不能及时的唤醒A,此时A,B两个线程都不能继续向下执行而形成了死锁。这就是suspend被弃用的原因。

2.7 yield方法

放弃当前cpu资源,让它让其他的任务去占用cpu的执行时间,但放弃的时间不确定,有可能刚刚放弃,马上又获得了cpu的时间片。
public void run()
{
    long beginTime = System.currentTimeMillis();
    int count = 0;
    for(int i=0;i<5000000;i++){
        Thread.yield();
        count = count + i + 1;
    }
    long endTime = System.currentTimeMillis();
    System.out.println("time " + (endTime - beginTime));
}

2.8 线程的优先级设置

setPriority()方法,可以设置线程的优先级。线程的优先级分为1~10个级别,如果大于10或小于1,JDK会抛出异常。JDK使用以下三个常量来预定义优先级的值。

public final static int MIN_PRIORITY = 1
public final static int NORM_PRIORITY = 5
public final static int MAX_PRIORITY = 10

Java线程优先级有以下几个注意点:

  • 线程的优先级具有继承性
  • 线程优先级具有规则性(CPU尽量将执行资源让给优先级较高的线程)
  • 线程优先级具有随机性(优先级较高的线程不一定每次都先执行完)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值