[未完成][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-04 单词方阵
问题描述 本次作业的题目要求利用给定的一组单词生成一个矩阵,矩阵的每个位置由一个字母填充,单词表中的每一个单词可以匹配矩阵中一段连续的序列,这段序列可以是横向,纵向或者是45度斜角方向,单词可以由左向 ...
- WebBrowser实现编辑网页
//1.显示网页 procedure TForm2.FormCreate(Sender: TObject); begin Panel1.Align := alTop; CheckBox1.Anchor ...
- POJ 3259 Wormholes(最短路,判断有没有负环回路)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 24249 Accepted: 8652 Descri ...
- eclipse svn切换账号登陆问题
1.当一个人有权限访问文件代码,而另一个账号无法访问该文件代码,要在eclipse上切换账号登陆有权限的账号时,eclipse会用缓存的账号,不会弹出从新输入新账号的窗口. 这样该怎么解决呢? 关闭e ...
- Linux(Centos)全自动异地备份数据(WEB+Mysql)
文章开始之前,先问下各位站长一个问题:什么东西对于站长是十分重要的?其实对于站长而言,很多东西都是很重要的.但我们现在排除外在因素,把范围缩小到网站系统本身,哪些是非常重要的呢?网站数据就是其中之一了 ...
- 简单的圆形图标鼠标hover效果 | CSS3教程
演示 本教程将和大将分享一些简单的圆形图标在鼠标hover时的动画效果.这种效果在不少时尚的酷站上都有.本教程中的例子主要是利用在a元素的伪元素上使用CSS transitions和animation ...
- 高扩展的基于NIO的服务器架构(二)
接上文高扩展的基于NIO的服务器架构 Reactor模式 如下图所示,将不同事件的检测分离开,当一种事件发生时一个事件处理器EventHandler将通知与该事件处理相对应的专用工作线程 采用这种架构 ...
- Web开源框架大汇总
Struts 项目简介信息 Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的.由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的 ...
- 汇编语言(学习笔记-----[bx]和loop)
1.[bx]是什么?? 和[0]有些类似,[0]表示内存单元,它的偏移地址是0 [bx]同样也表示一个内存单元,它的偏移地址在bx中,mov ax,[bx] (字) mov ...
- DuiVision开发教程(17)-对话框
DuiVision的对话框类是CDlgBase. 代码中假设须要创建一个对话框,一般建议使用DuiSystem类中封装的若干对话框相关的函数来操作,包括创建对话框.删除对话框.依据对话框名获取对话框指 ...