序,线程是比进程小的进程,非常广泛的被使用。

一、继承Thread实现线程操作

1、注意setDaemon(boolean)方法,参数为true时为守护线程,参数为false时为用户线程。

守护线程的意思是生命周期由创建此线程的线程(进程)决定,创建线程死亡,则守护线程死亡。与之对应的是用户线程,用户线程的生命周期由自己决定,不受其他线程约束。

例如下面:first线程由主线程main生成,则main方法死亡时,first线程也随之消亡。

2、重写run()方法实现业务逻辑代码。run()方法不接受参数,并且无返回值。

3、启动线程需要调用Thread对象的start()方法。

package com.huawei.demo;

import java.io.IOException;

public class TryThread extends Thread {
private String firstName;
private String secondName;
private long sleepTime; public TryThread(String firstName, String secondName, long sleepTime) {
this.firstName = firstName;
this.secondName = secondName;
this.sleepTime = sleepTime;
setDaemon(true);// 参数为true时为守护线程,参数为false时为用户线程
} public static void main(String[] args) {
Thread first = new TryThread("Hopalong ", "Cassidy", 2000L);
Thread second = new TryThread("Marrilyn ", "Monroe", 3000L);
Thread thrid = new TryThread("Slim ", "Pickens", 5000L);
System.out.println("Press Enter when you have had enough...\n");
first.start();// 启动线程
second.start();// 启动线程
thrid.start();// 启动线程 try {
System.in.read();
System.out.println("Enter Pressed...\n");
} catch (IOException e) {
System.out.println(e);
}
} @Override
public void run() {
while (true) {
try {
System.out.println(firstName);
sleep(sleepTime);// 休眠一定的时间
System.out.println(secondName);
} catch (InterruptedException e) {
System.out.println(firstName + secondName + e);
} }
} }

运行结果之一:

Press Enter when you have had enough...

Hopalong
Marrilyn
Slim
Cassidy
Hopalong
Monroe
Marrilyn
Pickens
Slim
Cassidy
Hopalong
Cassidy
Hopalong
Monroe
Marrilyn
Pickens
Slim
Cassidy
Hopalong
Monroe
Marrilyn Cassidy
Hopalong
Enter Pressed...

二、停止线程

interrupt()、isInterrupted()、、、、

线程可以调用Thread对象的interrupt()方法来发送信号给另一个线程告诉它该停止运行了。这本身并不能停止线程,它只是在线程中设置一个标志,指出有一个中断请求。

要想使这个标志起作用必须在run()方法中检测它。发生这种情况时,sleep()方法检测线程是否已经被中断,如果已经被中断,就会抛出一个InterruptedException异常。

可以通过调用线程的isInterrupted()方法检测线程是否已经中断。如果被检测的interrupt()方法被调用了,isInterrupted()方法就会返回true。

注意这只能判断线程是否已经通过调用interrupt()方法设置了中断标志,而不能确定线程是否仍在运行。设置线程的中断标志却仍可以运行,并不是说调用了interrupt()方法线程就要终止。测试线程是否仍在运行可以调用isAlive()方法,如果线程没有终于,该方法返回true;

实例方法isInterrupted()对于线程的中断标志没有影响,如果中断标志设置了,调用该方法后仍然设置。但是Thread类中的静态方法isInterrupted()却不同。它测试当前运行的线程是否被中断,如果已经中断,它清除当前Thread对象的中断标志并返回true。

当抛出InterruptedException异常时,线程中记录中断的标志被清除,所以接下来的isInterrupted()或interrupted()调用会返回false。

三、连接线程

如果一个线程中需要等待另一个线程消亡,可以调用join()方法来处理希望消亡的线程。join()方法将暂停当前的线程,直到指定的线程消亡。

thread1.join();

thread1.join(1000);也可指定一个时间,等待另一个线程消亡的毫秒数。

四、实现Runnable实现线程操作

package com.huawei.demo;

import java.io.IOException;

public class JumbleNames implements Runnable {

    private String firstName;
private String secondName;
private long sleepTime; public JumbleNames(String firstName, String secondName, long sleepTime) {
super();
this.firstName = firstName;
this.secondName = secondName;
this.sleepTime = sleepTime;
} public static void main(String[] args) {
Thread first = new Thread(new JumbleNames("Hopalong ", "Cassidy", 500L));
Thread second = new Thread(new JumbleNames("Marrilyn ", "Monroe", 800L));
Thread third = new Thread(new JumbleNames("Slim ", "Pickens", 1000L));
first.setDaemon(true);//守护线程
second.setDaemon(true);//守护线程
third.setDaemon(true);//守护线程
System.out.println("Press Enter when you have had enough...\n");
first.start();// 启动线程
second.start();// 启动线程
third.start();// 启动线程
try {
System.in.read();
System.out.println("Enter Pressed...\n");
} catch (IOException e) {
System.out.println(e);
}
System.out.println("Ending main()\n");
} @Override
public void run() {
while (true) {
try {
System.out.println(firstName);
Thread.sleep(sleepTime);// 休眠一定的时间
System.out.println(secondName);
} catch (Exception e) {
System.out.println(firstName + secondName + e);
} }
} }

1、为线程设置名称

Thread first = new Thread(new JumbleNames("Hopalong ", "Cassidy", 500L),"firstThread");

默认线程名称为Thread*加上一个序列号,也可以指定线程名称。

可以通过调用Thread对象的getName()来获得指定的线程名。也可以通过Thread中定义的setName()方法来改变线程名。

五、同步处理-使用方法

六、同步处理-同步语句块

七、线程间通信

八、线程优先级

九、死锁

2015年11月25 Java基础系列(二)Thread Runnable线程初级讲解的更多相关文章

  1. Java基础系列二:Java泛型

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.泛型概述 1.定 ...

  2. Java多线程系列二——Thread类的方法

    Thread实现Runnable接口并实现了大量实用的方法 public static native void yield(); 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机 ...

  3. 2015年12月28日 Java基础系列(六)流

    2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流

  4. 夯实Java基础系列11:深入理解Java中的回调机制

    目录 模块间的调用 多线程中的"回调" Java回调机制实战 实例一 : 同步调用 实例二:由浅入深 实例三:Tom做题 参考文章 微信公众号 Java技术江湖 个人公众号:黄小斜 ...

  5. Java基础系列1:深入理解Java数据类型

    Java基础系列1:深入理解Java数据类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括四个 ...

  6. Java基础系列-ArrayList

    原创文章,转载请标注出处:<Java基础系列-ArrayList> 一.概述 ArrayList底层使用的是数组.是List的可变数组实现,这里的可变是针对List而言,而不是底层数组. ...

  7. Java基础系列-Collector和Collectors

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10748925.html 一.概述 Collector是专门用来作为Stream的coll ...

  8. Java基础系列-二进制操作

    原创文章,转载请标注出处:<Java基础系列-二进制操作> 概述 Java源码中涉及到大量的二进制操作,非常的复杂,但非常的快速. Java二进制表示法 首先了解下二进制,二进制是相对十进 ...

  9. Git学习(二)(2015年11月18日)(2016年1月29日)

    2015年11月18日Git学习: .Shell 删除文件夹及其所有文件 rd/s/q 文件目录 ---------------当前为先创建本地Git库后与网上Git服务器关联------------ ...

随机推荐

  1. GitHub项目大全

    [微信网页版]: [查看被删的微信好友]https://github.com/0x5e/wechat-deleted-friends [网页版微信API,包含终端版微信及微信机器人]https://g ...

  2. 降低磁盘IO使Oracle性能优化(转)

    文章转自:http://blog.chinaunix.net/uid-26813519-id-3207996.html 硬件方面虽然只占Oracle性能优化的一个方面(另一方面是软件),但是仍不可忽视 ...

  3. 谈谈favicon和他带来的问题

    favicon.ico介绍 favicon.ico是个什么东西呢,也许见得太多都习以为常了(我就是这样,直到写这篇文章之前才知道),看看维基百科的解释: Favicon是favorites icon的 ...

  4. HDU 4768 Flyer(二分)

    题目链接: 传送门 Flyer Time Limit: 1000MS     Memory Limit: 32768 K Description The new semester begins! Di ...

  5. PHP之:PHP编程效率的20个要点

    [导读] 用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数” 用单引号 ...

  6. linux配置网卡

    我爱折腾.在本地虚拟机里装了linux的环境.要配置linux的网卡文件. 如下: vi /etc/sysconfig/network-script/ifcfg-eth0; 刚装完系统,没有vim , ...

  7. centos 搭建git服务器

    centos 6搭建git服务器 安装 rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm yum ins ...

  8. angular state和stateParams

    angular ui-route通过路由传递参数 发送ctrl var model = { data: positionid }; $state.go('app.position.publish', ...

  9. CSS3-实现单选框radio的小动画

    在微信上看到一个教程文,觉得制作的小动画还是很有意思的,自己也试验了一下.一开始动画怎么都不执行(我用的HB),因为内置浏览器对css3的不兼容.加上各种浏览器前缀后就好了.但是旋转那个效果,在HB里 ...

  10. 自然语言16.1_Python自然语言处理学习笔记之信息提取步骤&分块(chunking)

    QQ:231469242 欢迎喜欢nltk朋友交流 http://www.cnblogs.com/undercurrent/p/4754944.html 一.信息提取模型 信息提取的步骤共分为五步,原 ...