(1)Java多线程编程核心——Java多线程技能
1、为什么要使用多线程?多线程的优点?
提高CPU的利用率
2、什么是多线程?
3、Java实现多线程编程的两种方式?
a、继承Thread类
|
public class MyThread01 extends Thread { public static void main(String[] args){ |
|
运行结束 MyThread01 |
|
多次调用start(),抛异常 |
public class MyThread01 extends Thread {
|
|
Exception in thread "main" java.lang.IllegalThreadStateException at java.lang.Thread.start(Thread.java:705) at com.season.testthread.MyThread01.main(MyThread01.java:13) MyThread01 |
b、实现Runnable接口
public class MyRunnable01 implements Runnable {
|
|
main()..... MyRunnable01 run()..... |
4、两种方式的对比?
Thread类本身实现了Runnable接口;
使用Thread类方式创建线程,最大的局限是不支持多继承
5、start() 和 直接调用run() 有什么异同?
Thread.java类中的 start() 通知“线程规划器”此线程已经准备就绪,等待调用线程对象的 run()。run()是由调用线程执行,必须等待 run() 代码执行完成才能执行后面代码,不具有异步效果。
6、非线程安全?
多个线程对同一对象中的同一实例变量进行操作时会出现值被更改、值不同步的情况,进而影响程序的执行流程。
|
(1)不共享数据情况 |
|
public class MyThread02 extends Thread { @Override public static void main(String[] args){ |
|
由 a 计算,count=4 由 a 计算,count=3 由 a 计算,count=2 由 a 计算,count=1 由 a 计算,count=0 由 c 计算,count=4 由 c 计算,count=3 由 c 计算,count=2 由 c 计算,count=1 由 c 计算,count=0 由 b 计算,count=4 由 b 计算,count=3 由 b 计算,count=2 由 b 计算,count=1 由 b 计算,count=0 |
|
(2)共享数据情况 |
|
public class MyThread03 extends Thread { @Override public static void main(String[] args){ |
|
由 c 计算,count=3 由 c 计算,count=2 由 c 计算,count=1 由 c 计算,count=0 由 a 计算,count=3 |
7、怎么解决非线程安全问题?
使用 synchronized 关键字:当一个线程要执行同步方法里面的代码时,线程首先尝试去拿这把锁,如果能拿到,这个线程就可以执行synchronized 里面的代码。如果拿不到,那么这个线程就会不断尝试拿这把锁,直到拿到为止,而且是有多个线程同时去争抢这把锁。
8、API
|
currentThread() 返回代码段正在被哪个线程调用的信息。 |
|
isAlive() 判断当前线程是否处于活动状态(线程已经启动且尚未终止)。 |
|
sleep() 在指定的毫秒内让当前“正在执行的线程”休眠(暂停执行) |
|
getId() 取得线程的唯一标识 |
|
yield() 放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片。 |
9、怎么停止线程?
1)、使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
2)、使用 stop() 强行终止线程,不推荐使用这种方法,因为 stop 和 suspend 及 resume 一样,都是作废过期的方法,使用它们可能产生不可预料的结果。如果强行让线程停止则可能使一些请理性的工作得不到完成。另外一个情况就是对锁定的对象进行了“解锁”,导致数据得不到同步处理,出现数据不一致问题。
3)、使用 interrupt() 中断线程。
|
interrupt() 仅仅是在当前线程中打了一个停止标记,并不是真的停止线程。 this.interrupted() 测试当前线程是否已经中断状态,执行后具有将状态标识置清除为false的功能。当前线程是指运行 this. Interrupted() this.isInterrupted() 测试线程Thread对象是否已经是中断状态,但不清除状态标识。 |
|
a、能停止的线程——异常法 |
|
public class MyThread04 extends Thread { @Override public void run() { for(int i = 0; i < 500000; i++){ if(this.interrupted()){ System.out.println("已经是停止状态,立即退出!"); break; } System.out.println("i = " + (i + 1)); } System.out.println("for下面语句运行,线程并未停止。"); } public static void main(String[] args) { try { MyThread04 myThread04 = new MyThread04(); myThread04.start(); Thread.sleep(2000); myThread04.interrupt(); } catch (InterruptedException e) { System.out.println("main catch{}..."); e.printStackTrace(); } System.out.println("main() end ...."); } } |
|
i = 207023 main() end .... 已经是停止状态,立即退出! for下面语句运行,线程并未停止。 |
|
上面的示例虽然停止了线程,但是如果for下面还有语句,还是会继续运行的。 该如何解决语句继续运行的问题呢? |
|
package com.jvm.thread; public class MyThread04 extends Thread { @Override public void run() { try { for (int i = 0; i < 500000; i++) { if (this.interrupted()) { System.out.println("已经是停止状态,立即退出!"); throw new } System.out.println("i = " + (i + 1)); } System.out.println("for下面语句运行,线程并未停止。"); } catch (InterruptedException e) { System.out.println("进入 MyThread04 类的 run() 的catch{}..."); e.printStackTrace(); } } public static void main(String[] args) { try { MyThread04 myThread04 = new MyThread04(); myThread04.start(); Thread.sleep(2000); myThread04.interrupt(); } catch (InterruptedException e) { System.out.println("main catch{}..."); e.printStackTrace(); } System.out.println("main() end ...."); } } |
|
i = 220112 i = 220113 main() end .... 已经是停止状态,立即退出! 进入 MyThread04 类的 run() 的catch{}... java.lang.InterruptedException at |
|
b、使用 return 停止线程 interrupt() 与 return 结合使用 |
|
package com.jvm.thread; public class MyThread05 extends Thread { @Override public void run() { while(true){ if(this.isInterrupted()){ System.out.println("停止了!"); return; } } } public static void main(String[] args) throws MyThread05 myThread05 = new MyThread05(); myThread05.start(); Thread.sleep(2000); myThread05.interrupt(); } } |
10、怎么暂停线程?
暂停线程意味着此线程还可以恢复运行。在java多线程中,可以使用suspend() 暂停线程,使用 resume() 恢复线程的执行。
suspend 与 resume 方法的缺点——独占
suspend 与 resume 方法的缺点——不同步
11、线程的优先级
在操作系统中,线程可以划分优先级,优先级较高的线程得到的CPU资源较多,也就是CPU优先执行优先极高的县城对象中的任务。
设置线程优先级有助于帮组“线程规划器”确定下一次选择哪一个线程来优先执行。
优先级具有随机性。
12、守护线程
在Java线程中有两种线程,一种是用户线程,另一种是守护线程。
当进程中不存在非守护线程了,则守护线程自动销毁。典型的守护线程就是垃圾回收线程。
(1)Java多线程编程核心——Java多线程技能的更多相关文章
- Java多线程编程核心(1)
Java多线程编程核心(1) 停止线程 本节主要讨论如何更好停止一个线程.停止线程意味着在线程处理完成任务之前放弃当前操作. 1.停不了的线程 可能大多数同学会使用interrupt()来停止线程,但 ...
- Java多线程编程(1)--Java中的线程
一.程序.进程和线程 程序是一组指令的有序集合,也可以将其通俗地理解为若干行代码.它本身没有任何运行的含义,它只是一个静态的实体,它可能只是一个单纯的文本文件,也有可能是经过编译之后生成的可执行文 ...
- Java并发编程核心知识体系精讲
第1章 开宗明义[不看错过一个亿]本章一连串设问:为什么学并发编程?学并发编程痛点?谁适合学习本课?本课程包含内容和亮点?首先4大个理由告诉你为什么要学,其实源于JD岗位要求就不得不服了.其次5个痛点 ...
- Java并发编程:Java的四种线程池的使用,以及自定义线程工厂
目录 引言 四种线程池 newCachedThreadPool:可缓存的线程池 newFixedThreadPool:定长线程池 newSingleThreadExecutor:单线程线程池 newS ...
- Java多线程编程核心技术---Java多线程技能
基本概念 进程是操作系统结构的基础,是一次程序的执行,是一个程序及其数据结构在处理机上顺序执行时所发生的活动,是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的独立单位.线程可以理解成是在进 ...
- Java多线程编程核心 - 对象及变量的并发访问
1.什么是“线程安全”与“非线程安全”? “非线程安全”会在多个线程对同一对象总的实例变量进行并发访问时发生,产生的后果是“脏读”,也就是取到的数据其实是被更改过的. “线程安全”是以获得的实例变量的 ...
- Java多线程编程核心技术(三)多线程通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- day05 Java网络编程socket 与多线程
java网络编程 java.net.Socket Socket(套接字)封装了TCP协议的通讯细节,是的我们使用它可以与服务端建立网络链接,并通过 它获取两个流(一个输入一个输出),然后使用这两个流的 ...
- 《Java多线程编程核心技术》——多线程与同步
Java多线程 线程可以理解为是在进程中独立运行的子任务. Java多线程 使用方法 Java中实现多线程主要有以下两种方法: 继承Thread,而后实例化该对象调用start()即启动了新线程; 实 ...
随机推荐
- java集合类型接口和实现类个人总结
转载:http://blog.csdn.net/qingchunbusanchang/article/details/39576749 java的集合是一个比较综合的概念,相关的知识有很多的博客里面做 ...
- Win7如何自定义鼠标右键菜单 添加用记事本打开
鼠标右键用记事本打开.reg Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\Notepad] @="用记事本 ...
- appium在MAC上环境搭建
1. 安装.启动Appium bixiaopeng@bixiaopeng ~$ npm install -g appium Password: npm http GET https://registr ...
- 原生domReady封装
核心思路: 标准浏览器(含IE9+)比较简单,直接监听DOMContentLoaded事件: 低版本的IE(IE678)两套机制: 1)尝试轮询document.documentElement.doS ...
- ReactiveCocoa入门教程——第二部分【转载】
ReactiveCocoa是一个框架,它能让你在iOS应用中使用函数响应式编程(FRP)技术.在本系列教程的第一部分中,你学到了如何将标准的动作与事件处理逻辑替换为发送事件流的信号.你还学到了如何转换 ...
- com.opensymphony.xwork2.ognl.OgnlValueStack - Error setting expression 'customer.applyRate' with value '[Ljava.lang.String;@7d3fae2c'
出错的3个最可能的原因:我是第二种错误 1.action配置错误 <action name="doCreateMeetingInfo" class="meeting ...
- 在 CentOS 6.4上安装Erlang
如何在CentOS 6.4上安装erlang,具体的Erlang版本是R15B03-1. 在安装之前,需要先要安装一些其他的软件,否则在安装中间会出现一些由于没有其依赖的软件模块而失败. 一开始,要是 ...
- 为什么引入TSS
[0]README text description from orange's implemention of a os and for complete code ,please visit ht ...
- nodejs实如今线群聊
这不是一个项目而是一个适合刚開始学习的人学习的样例.主要实现了下面基本功能: 1:群聊.每个人都能够收到其它人的消息,以及能够发消息给其它人,每个人用ip地址标识. 2:显示当前在线用户. 3:每个用 ...
- Unity3D 与 objective-c 之间数据交互。iOS SDK接口封装Unity3D接口 .-- 转载
Unity 3D 简单工程的创建.与Xcode 导出到iOS 平台请看这 Unity3D 学习 创建简单的按钮.相应事件 Unity C# 代码 using UnityEngine; using Sy ...