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

一、继承Thread实现线程操作

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

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

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

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

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

  1. package com.huawei.demo;
  2.  
  3. import java.io.IOException;
  4.  
  5. public class TryThread extends Thread {
  6. private String firstName;
  7. private String secondName;
  8. private long sleepTime;
  9.  
  10. public TryThread(String firstName, String secondName, long sleepTime) {
  11. this.firstName = firstName;
  12. this.secondName = secondName;
  13. this.sleepTime = sleepTime;
  14. setDaemon(true);// 参数为true时为守护线程,参数为false时为用户线程
  15. }
  16.  
  17. public static void main(String[] args) {
  18. Thread first = new TryThread("Hopalong ", "Cassidy", 2000L);
  19. Thread second = new TryThread("Marrilyn ", "Monroe", 3000L);
  20. Thread thrid = new TryThread("Slim ", "Pickens", 5000L);
  21. System.out.println("Press Enter when you have had enough...\n");
  22. first.start();// 启动线程
  23. second.start();// 启动线程
  24. thrid.start();// 启动线程
  25.  
  26. try {
  27. System.in.read();
  28. System.out.println("Enter Pressed...\n");
  29. } catch (IOException e) {
  30. System.out.println(e);
  31. }
  32. }
  33.  
  34. @Override
  35. public void run() {
  36. while (true) {
  37. try {
  38. System.out.println(firstName);
  39. sleep(sleepTime);// 休眠一定的时间
  40. System.out.println(secondName);
  41. } catch (InterruptedException e) {
  42. System.out.println(firstName + secondName + e);
  43. }
  44.  
  45. }
  46. }
  47.  
  48. }

运行结果之一:

  1. Press Enter when you have had enough...
  2.  
  3. Hopalong
  4. Marrilyn
  5. Slim
  6. Cassidy
  7. Hopalong
  8. Monroe
  9. Marrilyn
  10. Pickens
  11. Slim
  12. Cassidy
  13. Hopalong
  14. Cassidy
  15. Hopalong
  16. Monroe
  17. Marrilyn
  18. Pickens
  19. Slim
  20. Cassidy
  21. Hopalong
  22. Monroe
  23. Marrilyn
  24.  
  25. Cassidy
  26. Hopalong
  27. 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实现线程操作

  1. package com.huawei.demo;
  2.  
  3. import java.io.IOException;
  4.  
  5. public class JumbleNames implements Runnable {
  6.  
  7. private String firstName;
  8. private String secondName;
  9. private long sleepTime;
  10.  
  11. public JumbleNames(String firstName, String secondName, long sleepTime) {
  12. super();
  13. this.firstName = firstName;
  14. this.secondName = secondName;
  15. this.sleepTime = sleepTime;
  16. }
  17.  
  18. public static void main(String[] args) {
  19. Thread first = new Thread(new JumbleNames("Hopalong ", "Cassidy", 500L));
  20. Thread second = new Thread(new JumbleNames("Marrilyn ", "Monroe", 800L));
  21. Thread third = new Thread(new JumbleNames("Slim ", "Pickens", 1000L));
  22. first.setDaemon(true);//守护线程
  23. second.setDaemon(true);//守护线程
  24. third.setDaemon(true);//守护线程
  25. System.out.println("Press Enter when you have had enough...\n");
  26. first.start();// 启动线程
  27. second.start();// 启动线程
  28. third.start();// 启动线程
  29. try {
  30. System.in.read();
  31. System.out.println("Enter Pressed...\n");
  32. } catch (IOException e) {
  33. System.out.println(e);
  34. }
  35. System.out.println("Ending main()\n");
  36. }
  37.  
  38. @Override
  39. public void run() {
  40. while (true) {
  41. try {
  42. System.out.println(firstName);
  43. Thread.sleep(sleepTime);// 休眠一定的时间
  44. System.out.println(secondName);
  45. } catch (Exception e) {
  46. System.out.println(firstName + secondName + e);
  47. }
  48.  
  49. }
  50. }
  51.  
  52. }

1、为线程设置名称

  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. SVN中(trunk tags branches)的使用理解

    trunk--主干(永远都是最新的,每发布一个版本会在tags和branches上进行分支) tags-标签(只读,用于存放发布后的文件冻结,以及对应发布后版本的源文件:可以是来自主干或者分支的发布: ...

  2. J-link烧写brjtag工具

    J-Link用的山寨货,不知道山寨了几代的那种....用的STM32F103C8T6的小板也是山寨了好几代那种,才25块钱...好在能用,J-Link用segger公司的软件能识别,也能找到CPU,板 ...

  3. 爬虫例子及知识点(scrapy知识点)

    新知识: 新建一个scrapy项目:scrapy startproject xxx(项目名称) 运行一个scrapy项目:scrapy crawl xxx(项目名称) 项目文件说明: 文件说明: • ...

  4. tableview的重用机制(面试必问)

    iphone重用机制是苹果为了实现大量数据显示而采用的一种节省内存的机制,比如在UITableView和ScrollView 等地方.为什么要“可重用”???对于我们的项目来说,内存控制是必不可少的, ...

  5. Beta版本——第二次冲刺博客

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...

  6. Setting up Django and your web server with uWSGI and nginx

    https://uwsgi.readthedocs.io/en/latest/tutorials/Django_and_nginx.html Setting up Django and your we ...

  7. BZOJ3160: 万径人踪灭

    设a[i]=bool(s[i]=='a'),b[i]=bool(s[i]=='b'),考虑a和a.b和b的卷积,由于卷积是对称的,就可以统计出不连续回文子串个数了.可能说得比较简略.再用manache ...

  8. BZOJ3685: 普通van Emde Boas树

    显然这题的所有操作都可以用set,但是直接用set肯定要T,考虑到读入量较大,使用fread读入优化,就可以卡过去了. #include<bits/stdc++.h> using name ...

  9. css的核心内容 标准流、盒子模型、浮动、定位等分析

    1.块级元素:如:<div></div>2.行内元素:如:<span></span>从效果中看块级元素与行内元素的区别: 通过CSS的设置把行内元素转换 ...

  10. asp.net ListBox 移除操作的思路

    ArrayList arrRight = new ArrayList(); protected void ImageButton1_Click(object sender, ImageClickEve ...