Java线程简析
来源:互联网 发布:excel如何去除重复数据 编辑:程序博客网 时间:2024/06/06 00:02
线程
软件中并发的执行过程(方法)。
并发
操作系统采用分时调度策略将多个程序交替运行,宏观上,就是几个程序同步后执行。
java中的多线程编程
Thread
Thread 线索,线程。
Thread 封装了操作系统对线程的地调度过程。
使用Thread类创建线程
1. 继承Thread类,继承了复杂的线程管理功能。
2. 重写run方法,就是并发执行的方法,线程执行时候,将执行修改以后的run方法。
3. 用start方法,启动线程:将线程交付给操作系统,由操作系统负责调度管理。
直接执行run方法,就不是线程执行了
线程代码
class MyThread extends Thread{ public void run(){ System.out.println("HelloWorld"); } }MyThread t = new MyThread();t.start();
线程实现
- 继承Thread
- 重写run方法
- 创建线程对象
使用Runnable 接口
- 实现Runnable接口,实现run方法。
- 创建接口的子类实例。
- 创建线程对象,讲接口的子类实例作为线程参数。
- 调用用start方法,启动线程。
- 使用实现Runnable接口,可以更好的避免由于Java单继承特性,
导致的扩展性难,同时实现了线程的共享性
案例:
class MyRunner implements Runable{ public void run(){ System.out.println("Hello World"); } } //启动线程 MyRunner runner = new MyRunner(); Thread t = new Thread(runner); t.start();>使用Runnable接口创建线程的好处是,当前的可以继承于其他的类,>也可以继承其他的接口。
线程的状态
- new 是新建状态,使用new运算创建线程对象,是线程的初始状态。
- Runnable 可运行状态,也称就绪状态,线程已经交接给操作系统,由操作系统负责调用,等待合适的时机准备运行。
- Running 正在运行状态,操作系统分配时间片给线程,线程调度到CPU执行。
- Delete 线程结束状态,线程结束了run方法,线程将会被垃圾回收器回收,死亡线程将不会再被调用。
- Java启动的时候,会自动创建并启动主线程。
- main方法被主线程调用。
线程优先级表
- 默认优先级5
- 最高优先级 10
- 最低优先级 1
- 优先级高的线程,获取CPU时间片多,执行机会多
- 但是在计算机资源丰富的情况下,运行结果不明显
守护线程
- 守护线程与普通线程并没有什么区别,我们只需要通过Thread提
供的方法来设定即可- void setDaemon(boolean)
- 当参数为true时该线程为守护线程
- 守护线程的特点是:当进程中只剩下为守护线程时,所有守护线程强制终止
- GC就是运行在一个守护线程上的
当全部前台线程结束的时候,如果后台线程还没有结束
这时候,守护线程结束,不会执行后面的操作
CyclicBarrier和CountDownLatch
都可以用来让一组线程等待另一组线程。但是CyclicBarrier可以重复
使用,CountDownLatch不可重复使用,就是直到等待线程全部结束后
使用
管程锁定规则,程序次序规则,volatile变量规则,
- 程序次序规则:线程内代码能够按先后顺序执行。
- 管程锁定规则:对于同一个锁,一个解锁操作一定要发生在(时间上)
另一个锁操作之前。 - volatile变量规则:前一个对volatile的写操作在后一个volatile
的读操作之前。- volatile是一个特殊的修饰符,,只有成员变量才能使用它。
在Java并发程序缺少同步类的情况下,多线程对成员变量操作对
其他线程时透明的。 - volatile变量可以保证下一个读取操作会在前一个写操作之后
发生。
- volatile是一个特殊的修饰符,,只有成员变量才能使用它。
- 线程启动规则:一个线程的所有操作均在线程启动之后。
- 终止规则:所有的线程操作均在线程终止之前完成。
- 对象终结规则:一个对象的终结操作必须发生在对象构造完成之后。
- 可传递性
Sleep
- 用于使程序进行适当休眠。
- 唤醒机制,用于两个线程之间进行协调工作。
线程进入sleep block 时候,线程不占用处理器,操作系统可以讲处
理器分配给其他的线程,线程只有在running的时候才占用处理器
6/5/2017 9:08:49 PM
yeild()方法
线程停下来等待另一个线程(主动放弃当前对处理器的调用)
jion()方法
两个或者多个线程协调,一个线程必须结束另一个线程才能开启
public class ThreadDemo2{ public static void main(String[] args){ T1 t1 = new T1(); T2 t2 = new T2(); List<Integer> list = new ArrayList<Integer>(); t1.list = list; t2.list = list; t1.t2 = t2; t2.t1 = t1; t1.start(); t2.start(); }}class T1 extends Thread{ List<Integer> list; public void run(){ for(int i = 0;i<10;i++){ list.add((int)(Math.random()*100)); } System.out.println("T1:"+list); }}class T2 extends Thread{ List<Integer> list; T1 t1; public void run(){ try{ t1.join(); //t1线程正常结束 Collections.sort(t1); System.out.println("T2" + list); }catch(InterruptedException e){ e.printStackTrace(); } }}
阅读全文
0 0
- java线程简析
- java线程简析
- Java线程简析
- java线程实例详析
- Java线程:什么是线程
- Java线程:线程池
- java线程--线程退出
- JAVA-线程/线程锁
- Java线程:什么是线程
- Java线程:线程中断
- Java线程:线程状态
- Java线程: 线程调度
- Java线程:线程交互
- java--线程--线程池
- java 线程
- Java线程
- java线程
- java线程
- Python Beautifulsoup 自学过程中遇到的一些问题
- java、js获取当前日期时间
- Expected one result (or null) to be returned by selectOne(), but found: 2
- gradle项目swagger配置
- mxGraph 导出图片节点中文乱码问题解决方案
- Java线程简析
- 自动化运维之ansible的ad-hoc
- 初次熟悉使用jenkins 持续集成
- 雅虎初始化css
- 【云星数据---mesos实战系列】:marathon实战Constraints篇-002
- Mistral 经典案例
- LeetCode-121. Best Time to Buy and Sell Stock
- 解决初学javaWeb者缺少Mysql数据库连接的Jar包引起的问题。
- LeetCode--Minimum Depth of Binary Tree