一、Java中实现多线程的两种方式
1) 继承Thread类
Thread类包括了包括和创建线程所需的一切东西。

Thread 最重要的方法是 run()。编写线程程序时须要覆盖 run() 方法,run() 方法是与别的线程并行运行的,故存在资源竞争和同步问题。

。Thread 还包括一个特殊的方法 start()。其作用是对线程进行特殊的初始化。然后调用run()。
调用start方法方可启动线程,而run方法仅仅是thread的一个普通方法调用。还是在主线程里运行。应该把须要并行处理的代码放在run()方法中,start()方法启动线程将自己主动调用 run()方法,这是由jvm的内存机制规定的。

而且run()方法必须是public訪问权限。返回值类型为void.。
2) 实现Runable接口
Runable接口仅仅有一个函数 run(),该函数必须由实现了该接口的类来实现。

使用 Runable 接口的时候不能直接创建所需类的对象并运行它,而必须从 Thread 类的一个实例内部运行。

二、线程状态
线程生命周期中共同拥有4中状态:新状态、可运行状态、死亡状态和堵塞状态。当中,
新状态:线程已创建。而start()还没有调用;
可运行状态:线程可以运行,等待CPU时间被分配给该线程后就可以;
死亡状态:run()返回后线程就会死亡。

或者调用stop()或者destroy()方法也会使得线程死亡。然而stop()会产生异常,destroy()则是强制终止从而没有释放锁;
堵塞状态:线程不会被分配CPU时间,无法运行。

堵塞状态情况比較复杂,线程进入堵塞状态的原因主要是:
1)调用sleep(ms),进入睡眠
2)调用suspend(),挂起线程。(调用resume()恢复运行)
3)调用wait(),暂停线程。(调用notify()或者notifyAll()恢复运行)
4)I/O 堵塞
5)调用还有一个处于锁定状态的对象的同步方法

三、对象的锁
Java中全部对象都具有隐式关联的监视程序,即“锁”。

程序不用去生成一个锁的对象,由于不论什么对象都具有了锁,通常在程序中都使用this对象。

与锁有关的方法有:
1)wait()
调用该方法的线程须要等待。直到得到该对象的锁,线程才干继续运行。
2)wait(long)和wait(long,int)
传递的參数指定了线程可以等到的最长时间。假设指定时间内没有得到锁,则会抛出异常interrupedException,程序处理完异常后继续运行。
3)notify()和notifyAll()
在锁对象上调用notify()或者notifyAll()方法就行释放对象上的锁。

当中,notify()仅仅能唤醒一个等待该锁的线程;而notifyAll()则会唤醒全部等待该锁的线程,然而被唤醒的线程中哪个会获得锁是由虚拟机来决定的。

四、线程的同步
synchronized 语句通过使用对象锁同步多个线程对某一特定代码段的訪问,在不论什么时候都仅仅能有一个线程来运行被保护的代码。

synchronized (taskQueue) {
newTask.setTaskId(++taskCounter);
newTask.setSubmitTime(new Date());
taskQueue.add(newTask);
/* 唤醒队列, 開始运行 */
taskQueue.notifyAll();
}

以上样例中,运行 synchronized (taskQueue) 。线程必须取得对象taskQueue的锁。假设线程没有获取到对象taskQueue的锁。线程就会停止在 synchronized 指令上。

直到线程离开 synchronized 指令保护的代码段,线程会将锁返回给对象taskQueue。

最新文章

  1. robotframework,selenium启动不了打不开浏览器的问题访问不了网页
  2. PHP基础知识之对象复制
  3. java中异常注意问题(发生在多态是的异常问题)
  4. 每日学习心得:Linq解决DataTable按照某一列的值排序问题/DataTable 导出CSV文件/巧用text-overflow解决数据绑定列数据展示过长问题
  5. CenOS下搭建VPN服务
  6. 遍历input。select option 选中的值
  7. delpi中的RTTI初试
  8. Android 数据过滤器:Filter
  9. JDK自带VM分析工具jps,jstat,jmap,jconsole
  10. git记录(给老婆找的地址)
  11. 测者的测试技术手册:Junit单元测试遇见的一个枚举类型的坑(枚举类型详解)
  12. Web前端教程3-JavaScript教程
  13. [转载]如何快速下载、安装和配置chromedriver ?
  14. sqlserverdatasouce控件如何让添加删除修改自动化
  15. Android sdk下载找不到support library
  16. Java分布式集群,使用synchronized和Redis保证Job的原子性
  17. fiddler学习总结--手机端(APP/微信小程序)抓包
  18. web自动化测试---自动化脚本设置百度搜索每页显示条数
  19. 085 HBase的二级索引,以及phoenix的安装(需再做一次)
  20. 音频播放 音乐 MediaPlayer

热门文章

  1. List exercise
  2. ubuntu16.04下snort的安装(官方文档安装)(图文详解)
  3. MyBatis多参数传递之注解方式示例--转
  4. jquery easyui ajax data属性传值方式
  5. c#做对比软件
  6. JS由Number与new Number的区别引发的思考
  7. 陌上开花(CDQ分治)
  8. ArcGIS api for javascript——图层-创建定制的切片图层类型的图层
  9. 伸缩--也可用于tabs
  10. 计蒜客第一场A