进程和线程
来源:互联网 发布:mac os xcode 编辑:程序博客网 时间:2024/05/22 17:25
进程:1、程序(任务)的执行过程2、持有资源(共享内存、共享文件)和线程
线程:1、系统中的最小执行单元,2、一个进程中有多个线程,3,线程共享进程中的资源
线程交互:互斥或同步
如何正确的停止线程:设置退出标志,如:boolean isRunning;
interrupte()
this.isInterrrupted()方法作为判断 ,实质也是一种标志,但是调用sleep或join方法会抛出异常
错误的停止线程:stop()原因:线程会戛然而止,让线程不受控制,不知道做了那些工作,哪些工作没做。
while(!this.isInterrupted()) { System.out.println("运行中"); long starttime = System.currentTimeMillis(); while (System.currentTimeMillis() - starttime < 1000) { }}
wait()和notifyAll()
public void transfer(int from, int to, double amount) {// if (enrgyBoxes[from] < amount) {// return;// } synchronized(lockObject){ //进入wait set while(enrgyBoxes[from] < amount){ try { lockObject.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()); enrgyBoxes[from] -= amount; System.out.printf("从%d转移%10.2f单位能量到%d", from, amount, to); enrgyBoxes[to] += amount; System.out.println("能量总和" + getTotalEnergy()); //当业务逻辑处理完成后,释放锁,并唤醒在此对象上等待的所有线程 lockObject.notifyAll(); }
互斥:synchronized加锁实现线程互斥,多个线程竞争同一个资源,这是多个线程就是互斥的
同步:wait(),notify(),notifyAll()实现同步,都是Object对象的方法
多线程扩展:locks和condition
线程安全
死锁
模拟窗口买票:
继承Trhead类(错误的方法)public class TicketThread extends Thread { private int ticketCount = 5; private String name; private Object lockObject = new Object(); public TicketThread(String name){ this.name = name; } @Override public void run() { synchronized (lockObject) { while (ticketCount > 0) { ticketCount--; System.out.println(name + "卖了一张票,剩余" + ticketCount + "张"); } } }}
TicketThread t1 = new TicketThread("窗口一");TicketThread t2 = new TicketThread("窗口二");TicketThread t3 = new TicketThread("窗口三");t1.start();t2.start();t3.start();
实现Runnable接口(正确的写法)
public class TicketRunnable implements Runnable { private int ticketCount = 5; @Override public void run() { while (ticketCount > 0) { ticketCount--; System.out.println(Thread.currentThread().getName() + "卖了一张票,剩余" + ticketCount + "张"); } }}
TicketRunnable ticketRunnable = new TicketRunnable();Thread t1 = new Thread(ticketRunnable,"窗口一");Thread t2 = new Thread(ticketRunnable,"窗口二");Thread t3 = new Thread(ticketRunnable,"窗口三");t1.start();t2.start();t3.start();
线程的生命周期:
错误的停止线程:stop()原因:线程会戛然而止,让线程不受控制,不知道做了那些工作,哪些工作没做。
阅读全文
0 0
- 进程和线程
- 关于进程和线程
- 进程和线程
- 进程和线程
- 小解进程和线程
- 进程和线程
- 理解进程和线程
- 进程和线程
- 进程和线程
- 进程和线程 编程
- 进程和线程
- 进程和线程
- 线程和进程
- 进程和线程编程
- 程序、进程和线程
- 进程和线程 区别
- 进程和线程编程
- 什么是线程和进程
- 浅谈Android Architecture Components
- librtmp 编译
- unity3d读写XML文件
- 设计原则-接口隔离原则
- Eclipse新建Web项目出现The superclass "javax.servlet.http.HttpServlet" was not found...
- 进程和线程
- Sin your life 数学
- oracle--nvl表达式和distinct的使用
- 【bzoj1609】[Usaco2008 Feb]Eating Together麻烦的聚餐
- Qt入门:常用的Qt类
- android进行异步更新UI的四种方式
- 互联网+到底是个什么概念
- git如何从仓库中删除已经被跟踪的文件
- 查询数据库,表,表结构