本学习心得是为了加深自己的印象及以后回顾,如果能对你有些许帮助,那也是喜闻乐见。
一 创建方式:
① 重载Thread类里面的run函数:
class MyThead extends Thread{
@Override
public void run() {
//do your own job
}
}
②用Runnable
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}).start();
二 线程同步
通过synchronized (flag)来实现,其中flag是object的对象锁,主要对应的函数是wait() 、notify() 、notifyall()。
①wait执行后所在线程就立刻从所在代码处开始等待状态,代码不再执行,等同一的对象锁发出notify或者也调用wait时,会重新从等待地方的代码位置开始运行。
②notify()后,代码不会离开停止,会一直运行到所在同步模块执行完毕,然后释放锁给其他等待进程使用。
三线程的停止
虽然Thread有函数suspend resume sleep stop finish.
但是java官方已经方式使用stop suspend resume finish。只是保留了start.
推荐的停止方法有:使用标志来控制,使run函数自然运行结束。
但是这种情况在线程阻塞的情况下是无效的,
当线程处于非运行(Run)状态
当线程处于下面的状况时,属于非运行状态:
-
当sleep方法被调用。
-
当wait方法被调用。
-
当被I/O阻塞,可能是文件或者网络等等。
当线程处于上述的状态时,使用前面介绍的方法就不可用了。这个时候,我们可以使用interrupt()来打破阻塞的情况,如:
public void stop() { Thread tmpBlinker = blinker; blinker = null; if (tmpBlinker != null) { tmpBlinker.interrupt(); } }
当interrupt()被调用的时候,InterruptedException将被抛出,所以你可以再run方法中捕获这个异常,让线程安全退出:
try { .... wait(); } catch (InterruptedException iex) { throw new RuntimeException("Interrupted",iex); }