java中线程常用的方法

来源:互联网 发布:易语言调用淘宝api 编辑:程序博客网 时间:2024/05/22 14:13
1. java如何实现一个多线程
(1) 继承Thread
start()方法开启一个线程
(2) 实现Runnable
run()方法执行线程内容
Thread(Runnable)
2. 线程常用方法
a) currentThread()
在线程Thread1中调用该方法返回当前线程名字是thread1,在main方法中运行 thread1.start() 再调用该方法返回当前线程名字是main。所以该方法主要用来获取当前运行的线程。
b) isAlive() 检测当前线程是否是存活状态,存活返回true,否则返回false。
c) getId() 获取调用方线程的线程id。
d) stop()
暴力停止停止一个线程的运行。jdk api 过期作废的方法不建议使用,次方法使用时抛出 java.lang.ThreadDeath,此异常不需要显示捕获。同时存在一些潜在的问题,强制停止线程可能使一些清理的工作得不到完成,另外一个情况就是对锁定的对象“解锁”会导致监视器数据不能同步处理完成,出现数据不一致。推荐使用interrupt异常法。
e) sleep(long)
调用该方法后线程会使当前线程停止运行long毫秒,直到long毫秒后线程继续执行后边的逻辑,sleep期间线程呈等待状态,当调用该sleep方法的方法或者代码块获得到的情况下,线程呈同步阻塞状态,不会释放锁直到程序执行完成。
f) suspend()/resume()
suspend可以暂停线程,resume恢复线程。与stop一样,过期作废的方法。不推荐使用的原因----独占。使用不当时,极易对公共对象独占,其它线程获取不到公共同步对象,进而导致死锁。
g) yield()
放弃当前的CPU资源,放弃的时间不确定,可能刚刚放弃立马又获得到CPU时间片。在操作系统中线程优先级越高,CPU越优先执行。设置线程优先级可以使用setPriority(),在java中优先级被分为1~10,小于1或者大于10 抛出异常 throw new IllegalArgumentException()。
线程具有继承性,线程A启动线程B 则线程B拥有A同级的优先权。优先级高的线程总是大部分优先执行,但不代表全部会执行,优先级与代码执行的顺序无关,CPU会尽量将执行资源让给优先级较高的线程。
h) interrupt()/isInterrupted()/interrupted() 借鉴另外文档
i) wait()/wait(long)/notify()/notifyAll()
Object的方法,等待/通知,线程在执行该几个方法前,必须获得该对象的对象级别的锁,可以是同步方法或者同步代码块,如果没有锁则抛出IllegalMonitorStateException。调用wait()后线程进入等待状态,直到有线程调用了该对象监视器notify()/notifyAll() 对等待状态唤醒。wait(long) 方法在long毫秒后自动唤醒。wait与sleep不同的是sleep 不会释放锁,而wait会释放当前的线程所持有的对象锁。
在多线程中wait/notify 常被用于线程之间的通信。生产者与消费者之间的关系。
sleep与wait对比:
都可以使线程进入暂时停止的状态,sleep时间结束后自动唤醒,await时间结束后或者直到被notify后唤醒。
sleep睡眠期间不释放锁,wait释放
与interrupt结合使用都可以使用异常法停止线程,释放对象锁,但是wait的线程对象会进入线程等待池,等待被唤醒。
j) join()/join(long)
在很多情况下,主线程创建启动子线程后,如果子线程运行时间比较早,主线程先于子线程结束,如果主线程需要等待子线程处理完某些程序或者数据,主线程需要这样的逻辑或者数据时,就可以使用到join了。在主线程内调用thread.start()方法后调用thread.join()。则可以等到子线程结束后主线程执行结束。
join与interrupt相遇后,如果主线程被打断则抛出异常线程结束,此时子线程依然在运行。
join(long) 主线程只等待long毫秒,join基于wait实现,所以会释放锁。


0 0