Java高并发与多线程(三)-----线程的基本属性和主要方法
今天,我们开始Java高并发与多线程的第三篇,线程的基本属性和主要方法。
【属性】
- 编号(ID)
类型long
用于标识不同的线程,编号唯一,只存在java虚拟机的一次运行
- 名称(Name)
类型String
可以不设置,默认值为Thread-线程编号
- 线程类别(Daemon)
类型boolean
主要用于区分用户线程和守护线程
值为true表示该线程为守护线程,否则为用户线程
默认值与相应线程的父线程该属性值相同,该属性必须在线程启动前设置!否则会报错
-
- 用户线程
用户行为运行的线程;
一个Java虚拟机,必须等待所有的用户线程结束之后才可以停止运行。
-
- 守护线程
通常用于执行一些重要性不是很高的任务,比如监控资源等;
守护线程不会影响Java虚拟机的正常停止。
- 优先级(Priority)
类型int
该属性是给线程调度器的提示,用于表示应用程序那个线程优先运行,但是并不保证真实的线程执行顺序。
java定义了1~10的10个优先级别。默认值为5(普通优先级别)。
对应一个具体的线程而言,优先级别的默认值与父线程相同。
注:在JVM中,使用-Xss参数来控制每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M. |
【常用方法】
- public static native Thread currentThread()
返回当前线程,当前代码的执行线程
- public long getId()
此方法返回线程的唯一标识,是一个long型的正数,在线程创建的时候被赋值。
- public final native boolean isAlive()
isAlive方法用于判断当前线程是否处于活动状态。
什么是活动状态呢?
活动状态就是已经启动尚未终止的,线程处于正在运行或者准备开始运行的状态就认为线程是"活动"的。
(新建状态的线程isAlive()返回的是false)
- public synchronized void start()
启动线程
- public void run()
线程的实际执行方法
- public void interrupt ()
interrupt() 中断线程 由运行状态到死亡状态。
在Core Java中有这样一句话:"没有任何语言方面的需求要求一个被中断的程序应该终止。中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断 "。
中断线程操作实质上是修改了一下中断标示位为true
当前线程正在运行,仅仅修改标示位,不再做其他的事
当前线程正在阻塞,修改标识位,如果是join,sleep,yield,则会抛出Interrup异常,修改标示位为false
- public static boolean interrupted()
测试当前线程是否已经是中断状态,执行后具有清除中断状态功能。
- public boolean isInterrupted()
测试线程 Thread 对象是否已经是中断状态,但不清除中断状态标志。
- public static native void yield()
此方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU的时间。但是放弃的时间不确定,有可能刚刚放弃就马上获得CPU时间片。
sleep 方法使当前运行中的线程睡眠一段时间,进入超时等待状态,这段时间的长短是由程序设定的,yield方法使当前线程让出CPU占有权,但让出的时间是不可设定的。
yield()不会释放锁标志。
yield()只是使当前线程重新回到可运行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
yield()只能使同优先级或更高优先级的线程有执行的机会。
- public static native void sleep(long millis) throws InterruptedException
sleep 导致当前线程休眠;
与 wait 方法不同的是 sleep 不会释放当前占有的锁
sleep(long)会导致线程进入 TIMED-WATING状态,而 wait()方法会导致当前线程进入 WATING状态
可以抛出中断异常
Thread.sleep(0)
由于Java采用抢占式的线程调度算法,因此可能会出现某条线程常常获取到CPU控制权的情况,为了让某些优先级比较低的线程也能获取到CPU控制权,可以使用Thread.sleep(0)手动触发一次操作系统分配时间片的操作,这也是平衡CPU控制权的一种操作。
- void join()
等待相应线程结束,若线程A调用B的join方法,那么线程A会被暂停,直到线程B运行结束。
join方法中如果传入参数,则表示这样的意思:如果A线程中掉用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行。
join(0)等价于join()。
- public final void setPriority(int newPriority)
设置线程优先级
- public final void setDaemon(booleanon)
将线程设置为守护线程
- public static int activeCount()
程序中活跃的线程数
- public static native boolean holdsLock(Object obj)
当前线程是否拥有某个具体对象的锁。
- @Deprecated
public final void stop()
强制停止,已废弃
可能释放锁导致数据不对。
可能导致清理工作做不好。
- suspend和resume
暂停和恢复
同上,已废弃。
- public final native void wait (longtimeout)
继承object
调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断才会返回,需要注意的
是调用 wait()方法后,会释放对象的锁。
因此,wait 方法一般用在同步方法或同步代码块中。
- public final native void notify()
继承自object
唤醒在此对象监视器上等待的单个线程,如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的,并在对实现做出决定时发生,线程通过调用其中一个wait() 方法,在对象的监视器上等待,直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程,被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。
但是要注意,notify不释放锁。
类似的方法还有 notifyAll() ,唤醒再次监视器上等待的所有线程。
- public final native void notifyAll()
把该对象等待队列里面的所有线程唤醒,成为可运行线程。
本篇比较短,但是因为容易被遗漏掉,所以单独拿出来讲,下一篇咱们讲多线程里面的重头戏------锁。