[未完成][Mooc]关于线程的总结
进程和线程.
Eclipse,QQ都是进程.是程序或者任务的执行过程,是动态性.
持有资源(共享内存,共享文件)和线程. 这个资源就是内存.
每个程序在运行的时候都会分配一些内存.
Eclipse中的源代码文件编辑,源代码编译,语法校验.QQ中的文字聊天,收发文件都是对应的线程
进程是一个班级,班中每个学生都是一个线程.班中的学生中使用班级中的公共资源(座椅,粉笔等)
线程之间的通信(交互)有 互斥和同步.
类比到班级中就是,同一个班级中的学生进行的竞争和合作(同步).学习资料的竞争,班级活动中的合作.
java.lang 中的class Thread类和interface中的Runnable接口.
这两个中有一个共同的方法run()方法.
线程的创建:
Thread()
Thread(String name)
Thread(Runnable target)
Thread(Runnable target,String name)
线程的方法:
void start() 启动线程
static void sleep(long millis); 线程休眠
static void sleep(long millis,int nanos);线程休眠
void join() 使其他线程等待当前线程终止
void join(long millis);使其他线程等待当前线程终止
void join(long millis,int nanos);使其他线程等待当前线程终止
static void yield() 当前运行线程释放处理器资源
获取线程引用
static Thread currentThread() 返回当前运行的线程的引用
光说不练嘴把式!
代码演绎隋唐演义:
总共三个对象.
隋朝军队(军队:ArmyRunnable)和农民军队(英雄人物:KeyPersonThread).对应两个不同的线程.
还有一个舞台(Stage).
主要演员就是MrThread 和 Ms Runnable
Actor.java
public class Actor extends Thread{ public void run(){ System.out.println(getName()+" 是一个演员!"); int count = 0;//用来记录线程出现过多少次. boolean keepRunning = true;//作为线程运行的一个flag. while(keepRunning){ System.out.println(getName()+" 登台演出"+(++count)+"次"); if(count ==100){ keepRunning = false; } if(count%10==0){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } System.out.println(getName()+" 的演出结束了!"); } public static void main(String[] args) { Thread actor = new Actor(); actor.setName("Mr Thread"); actor.start(); Thread actressThread = new Thread(new Actress(),"Ms.Runnable"); // Thread(Runnable target,String name) actressThread.start(); } } class Actress implements Runnable{ @Override public void run() { //实现Runnable接口的话是要用Thread.currentThread().getName()来获取当前线程的名字. System.out.println(Thread.currentThread().getName()+" 是一个演员!"); int count = 0;//用来记录线程出现过多少次. boolean keepRunning = true;//作为线程运行的一个flag. while(keepRunning){ System.out.println(Thread.currentThread().getName()+" 登台演出"+(++count)+"次"); if(count ==100){ keepRunning = false; } if(count%10==0){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } System.out.println(Thread.currentThread().getName()+" 的演出结束了!"); } }
隋唐演义实战开发----军队.
隋唐演义实战开发----关键人物
如何停止线程:
stop
正确的停止java中的线程.
java中自带了一个stop方法
stop是java1.0中自带的停止线程的方式,但是随着时间的发展,人们发现他越来越多的缺点,最重要的就是使得我们的线程戛然而止.
我们甚至都不知道我们的线程完成了哪些工作,哪些工作还没有做.我们都没有机会去做一些清理的工作.
一个业务步骤(以一个for循环举例)都没有完成就停止(for循环中都没有到达一个i的结束条件时就结束)
连java官方也把stop()方法标注层了deprecate.
stop()方法不是一个正确的方法,不应该用它停止我们的线程.
停止线程的正确方法:
正确的方法---设置正确的旗标
如何停止线程,使用退出的标志.
上面用的stop()方法是一个业务步骤(以一个for循环举例)都没有完成就停止(for循环中都没有到达一个i的结束条件时就结束).
我们想要的是结束这个线程最起码完成一个业务(for循环中循环到的i值不能到任意就停止,而是至少要到达i该结束循环条件的时候)
停止线程广为流传的错误方法---interrupt()
interrupt()方法也不是用来停止线程的,初衷并不是停止线程.
这个地方有三个方法要注意区别:
void interrupt() 中断线程
static boolean interrupted() 测试当前线程是否已经中断
boolean isInterrupted() 测试线程是否已经中断。
interrupt()方法其实质还是用的退出"旗标"的方式.
当线程进入阻塞状态(sleep)的时候此时再被调用interrupt()方法的时候.
此时会产生两个结果,一是中断状态被清除,Thread线程的isInterrupted()方法就不能返回一个正确的是否被中断的状态.
代码中的while(!isInterrupted())就不能正确的退出了.第二个是sleep()会收到一个InterruptedException();
所以说Interrupted()不是一个正确的退出线程的方式,还是推荐用"退出旗标"的方式,不过修改代码还是可以正确的退出线程的.
(老师这个地方留作作业了)
WrongWayStopThread.java
=========未完待续===========
[未完成][Mooc]关于线程的总结的更多相关文章
- [未完成][Mooc]关于IO总结
整个课程的大纲:1.编码问题.2.File类的使用3.RandomAccessFile的使用4.字节流的使用.5.字符流的使用.6.对象的序列化和反序列化. 视频1:文件的编码Eclipse的一大特点 ...
- [未完成][Mooc]关于Linxu的总结(一)
视频1:Linux之前有个Minix(这个是一个教授用来教学用的)开源的,不是编译过的,不能通过QQ.exe找到其源码.后来Linus这个家伙搞了一个Linux.服务器领域超过百分之八十.linux是 ...
- ConcurrentDictionary线程不安全么,你难道没疑惑,你难道弄懂了么?
前言 事情不太多时,会时不时去看项目中同事写的代码可以作个参考或者学习,个人觉得只有这样才能走的更远,抱着一副老子天下第一的态度最终只能是井底之蛙.前两篇写到关于断点传续的文章,还有一篇还未写出,后续 ...
- 高并发WCF配置
在使用WCF做服务接口时,TCP模式肯定比Http效率高,Binary/MTOM格式的绑定也会Text格式的绑定高效. 两个endpoint,一个用来调试:ms-mex的binding是用来方便WCF ...
- python爬虫抓网页的总结
python爬虫抓网页的总结 更多 python 爬虫 学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自 ...
- Quartz的misfire特性
Quartz的misfire特性 只有一个线程.多个job 第一个job产生misfire(executeTime>Interval) 且是repeatForever 那么只会运行第一个job, ...
- 爬虫总结_python
import sqlite3 Python 的一个非常大的优点是很容易写很容易跑起来,缺点就是很多不那么著名的(甚至一些著名的)程序和库都不像 C 和 C++ 那边那样专业.可靠(当然这也有动态类型 ...
- python爬虫抓站的一些技巧总结
使用python爬虫抓站的一些技巧总结:进阶篇 一.gzip/deflate支持现在的网页普遍支持gzip压缩,这往往可以解决大量传输时间,以VeryCD的主页为例,未压缩版本247K,压缩了以后45 ...
- 使用python爬虫抓站的一些技巧总结:进阶篇
Reference:http://python.jobbole.com/82000/ 一.gzip/deflate支持 现在的网页普遍支持gzip压缩,这往往可以解决大量传输时间,以VeryCD的主页 ...
随机推荐
- 黄金点游戏之客户端(homework-05)
0. 摘要 之前我们玩了2次黄金数游戏,我也幸运的得到了一本<代码大全>,嘿嘿.这次的作业是一个Client/Server程序,自动化完成多轮重复游戏. 我完成了Client部分,使用C# ...
- DelphiXE8怎么使用调试模式
需求:在开发Android程序时,大家一直是使用ShowMessage.其实XE是支持下断点的. 操作: 1.小米手机用USB线,连到电脑上. 2.小米手机-设置-关于手机-"MIUI版本& ...
- JodaTime用法简介
JodaTime用法简介 Java的Date和Calendar用起来简直就是灾难,跟C#的DateTime差距太明显了,幸好有JodaTime 本文简单罗列JodaTime的用法 package co ...
- UVA10361 - Automatic Poetry
“Oh God”, Lara Croft exclaims, “it’s one of these dumb riddles again!” In Tomb Raider XIV, Lara is, ...
- HDU 2795 Billboard (线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题目大意:有一块h*w的矩形广告板,要往上面贴广告; 然后给n个1*wi的广告,要求把广告贴 ...
- Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences (矩阵快速幂)
题目链接:http://codeforces.com/problemset/problem/450/B 题意很好懂,矩阵快速幂模版题. /* | 1, -1 | | fn | | 1, 0 | | f ...
- Swift 简单的通讯录
Swift 通讯录实战 1.功能需求 整个项目由三个界面构成:首页面(全部联系人),添加联系人界面和联系人详情界面 整个项目使用纯代码编程 数据处理方面使用一个工具类,处理所有数据的增删改查. 首页由 ...
- 创建类模式(二):抽象工厂(Abstract Factory)
定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式. ...
- 再次理解JavaScript原型链和匿名函数
<!--------------------------------------------- 1.演示匿名加载 2.js单进程执行流 3.原型链理解 a.__proto__:属性每个对象都有 ...
- hdu 2553 N皇后问题 (经典DFS)
题目链接:点击链接 思路:用一维数组hang[num] = i,num表示第num行,i表示第i列,计算n = 1~10皇后的不同放置数量,然后打表 #include<stdio.h> # ...