1.介绍

线程可以使程序具有两条和两条以上的可运行的路径。尤其对多核CPU特别的重要。

2.创建线程

1.继承Thread类

一个类直接的继承Thread类的话,此类就具有了线程的能力,接下来仅仅须要重写继承的run()就可以。

  1. <span style="font-size:18px;">package com.Thread;
  2.  
  3. //定义实现Runnable接口的类
  4. class MyThread11 extends Thread
  5. {
  6. //实现run方法。指定线程运行的任务
  7. public void run()
  8. {
  9.  
  10. System.out.println("启动一个线程!");
  11. }
  12. }
  13. //主类
  14. public class Sample16_2
  15. {
  16. public static void main(String[] args)
  17. {
  18. //继承Thread的类创建线程对象
  19.  
  20. Thread t=new MyThread11();
  21. //启动线程
  22. t.start();
  23. System.out.println("启用线程了");
  24. }
  25. }
  26. </span>

2.实现Runnable接口

java採用的单继承,假设採用继承Thread类的话,会有非常多限制,因此常常採用的是继承Runnable接口来实现线程的创建。

  1. <span style="font-size:18px;">package com.Thread;
  2.  
  3. //定义实现Runnable接口的类
  4. class MyRunnable implements Runnable
  5. {
  6. //实现run方法。指定线程运行的任务
  7. public void run()
  8. {
  9.  
  10. System.out.println("恭喜你。线程被启动了,"
  11. +"运行了run方法中的代码!
  12.  
  13. 。。");
  14. }
  15. }
  16. //主类
  17. public class Sample16_1
  18. {
  19. public static void main(String[] args)
  20. {
  21. //创建实现Runnable接口的类的对象
  22. MyRunnable mr=new MyRunnable();
  23. //创建Thread对象,将第一步创建对象的引用作为构造器參数
  24. //传递,指定线程要运行的任务
  25. Thread t=new Thread(mr);
  26. //启动线程
  27. t.start();
  28. System.out.println("启用线程了");
  29. }
  30. }
  31. </span>

3.线程的同步

1.同步方法

同步方法是指使用synchronizedkeyword修饰的方法,进入同步方法运行的线程将获得同步方法所属对象的锁,一旦锁住。仅仅有该线程运行完,其它线程才干运行。因此保证了方法同步的安全性。

  1. <span style="font-size:18px;">package com.Thread;
  2. //资源类
  3. class Resource
  4. {
  5. synchronized void function1(Thread currThread)
  6. {
  7. System.out.println(currThread.getName()+
  8. "线程运行function1方法。!
  9.  
  10. !");
  11. try
  12. {
  13. Thread.sleep(1000);
  14. System.out.println(currThread.getName()
  15. +"线程睡醒了!
  16.  
  17.  
  18.  
  19. ");
  20. }
  21. catch(Exception e)
  22. {
  23. e.printStackTrace();
  24. }
  25. }
  26. synchronized void function2(Thread currThread)
  27. {
  28. System.out.println(currThread.getName()+
  29. "线程运行function2方法!!
  30.  
  31. !");
  32. }
  33. }
  34. //自己定义线程类
  35. class MyThread00 extends Thread
  36. {
  37. //资源对象的引用
  38. Resource rs;
  39. //构造器
  40. public MyThread00(String tName,Resource rs)
  41. {
  42. this.setName(tName);
  43. this.rs=rs;
  44. }
  45. public void run()
  46. {
  47. if(this.getName().equals("Thread1"))
  48. {//假设线程名称是Thread1訪问资源的function1方法
  49. rs.function1(this);
  50. }
  51. else
  52. {//假设线程名称不是Thread1訪问资源的function2方法
  53. System.out.println("Thread2启动。等待进入同步方法function2。。!");
  54. rs.function2(this);
  55. }
  56. }
  57. }
  58. //主类
  59. public class Sample16_8
  60. {
  61. public static void main(String args[])
  62. {
  63. Resource rs=new Resource();
  64. MyThread00 t1=new MyThread00("Thread1",rs);
  65. MyThread00 t2=new MyThread00("Thread2",rs);
  66. t1.start();
  67. try
  68. {
  69. Thread.sleep(10);
  70. }
  71. catch(Exception e)
  72. {
  73. e.printStackTrace();
  74. }
  75. t2.start();
  76. }
  77. }
  78. </span>

注意:一个对象能够有同步和非同步方法,仅仅有进入同步方法运行才须要获得锁。每一个对象仅仅有一把锁;若一个对象有多个同步的方法,当某线程訪问当中之中的一个的时候。其它线程不能訪问该对象重点额不论什么同步方法。若线程获得锁后进入睡眠或让步,则将带着锁一块睡眠或让步。

2.同步语句块

使用同步语句块能够提高程序的并发性,能够精确的确定同步的区域。

  1. <span style="font-size:18px;">package com.Thread;
  2.  
  3. //自己定义的线程类
  4. class MyThread33 extends Thread
  5. {
  6. //该引用为资源对象
  7. private Object resource;
  8. //无參构造器
  9. public MyThread33()
  10. {}
  11. //有參构造器
  12. public MyThread33(Object resource,String name)
  13. {
  14. //对线程进行初始化
  15. this.resource=resource;
  16. this.setName(name);
  17. }
  18. public void run()
  19. {
  20. //同步语句块
  21. synchronized(resource)
  22. {
  23. System.out.println(this.getName()
  24. +"线程訪问了资源!
  25.  
  26. !。");
  27. System.out.println(this.getName()
  28. +"线程带着锁睡觉去了!
  29.  
  30. !。");
  31. try
  32. {
  33. Thread.sleep(1000);
  34. }
  35. catch(Exception e)
  36. {
  37. e.printStackTrace();
  38. }
  39. System.out.println(this.getName()
  40. +"线程带着锁睡醒后释放了锁!!!
  41.  
  42. ");
  43. }
  44. }
  45. }
  46. //主类
  47. public class Sample16_10
  48. {
  49. public static void main(String[] args)
  50. {
  51. //创建资源对象
  52. Object resource=new Object();
  53. //创建2个线程
  54. MyThread33 mt1=new MyThread33(resource,"MT1");
  55. MyThread33 mt2=new MyThread33(resource,"MT2");
  56. //启动这2个线程
  57. mt1.start();
  58. mt2.start();
  59. }
  60. }
  61. </span>

注意:当中synchronized(XXX),XXX代表的是资源对象的引用。

4.线程的其它设置

1.线程的优先级

java中线程的优先级用1到10之间的整数表示,数值越大优先级越高。获得訪问CPU的机会越大。一般採用setPriority方法来设置。

  1. <span style="font-size:18px;">package com.Thread;
  2.  
  3. //定义继承Thread的类
  4. class MyThread1 extends Thread {
  5. // 重写run方法,指定该线程运行的代码
  6. public void run() {
  7. for (int i = 0; i <= 49; i++) {
  8. System.out.print("<Min" + i + "> ");
  9. }
  10. }
  11. }
  12.  
  13. // 定义另外一个继承Thread的类
  14. class MyThread2 extends Thread {
  15. // 重写run方法,指定该线程运行的代码
  16. public void run() {
  17. for (int i = 0; i <= 49; i++) {
  18. System.out.print("[Max" + i + "] ");
  19. }
  20. }
  21. }
  22.  
  23. // 主类
  24. public class Sample16_4 {
  25. public static void main(String[] args) {
  26. // 创建两个线程对象
  27. MyThread1 t1 = new MyThread1();
  28. MyThread2 t2 = new MyThread2();
  29. // 设置两个线程的优先级
  30. t1.setPriority(Thread.MIN_PRIORITY);
  31. t2.setPriority(Thread.MAX_PRIORITY);
  32. // 启动两个线程
  33. t1.start();
  34. t2.start();
  35.  
  36. }
  37. }
  38. </span>

2.线程的让步

在实际开发中有时候也须要让某线程让出CPU。使其它线程得意运行。这时候能够採用让步的操作。

一般调用yield方法。

  1. <span style="font-size:18px;">package com.Thread;
  2.  
  3. //定义Runnable的实现类
  4. class MyRunnable1 implements Runnable
  5. {
  6. //声明标识线程的两个字符串
  7. private String flagl;
  8. private String flagr;
  9. //MyRunnable的构造器
  10. public MyRunnable1(String flagl,String flagr)
  11. {
  12. //初始化标识字符串
  13. this.flagl=flagl;
  14. this.flagr=flagr;
  15. }
  16. //重写run方法,指定该线程运行的代码
  17. public void run()
  18. {
  19. for(int i=0;i<30;i++)
  20. {
  21. System.out.print(flagl+i+flagr);
  22. //调用yield方法使当前正在运行的线程让步
  23. Thread.yield();
  24. }
  25. }
  26. }
  27. //主类
  28. public class Sample16_5
  29. {
  30. public static void main(String[] args)
  31. {
  32. //创建两个实现Runnable接口的类的对象
  33. MyRunnable1 mr1=new MyRunnable1("[","] ");
  34. MyRunnable1 mr2=new MyRunnable1("<","> ");
  35. //创建两个线程Thread对象,并指定运行的target
  36. Thread t1=new Thread(mr1);
  37. Thread t2=new Thread(mr2);
  38. //启动线程t1、t2
  39. t1.start();
  40. t2.start();
  41. }
  42. }
  43. </span>

5.总结

本篇文章简单的总结了线程中的一些概念,可是这些概念是以后开发高级线程必备的知识,须要多理解。

Java学习笔记五(多线程)的更多相关文章

  1. 【原】Java学习笔记032 - 多线程

    package cn.temptation; public class Sample01 { public static void main(String[] args) { /* * [进程]:正在 ...

  2. Java学习笔记:多线程(一)

    Java中线程的五种状态: 新建状态(New) 就绪状态(Runnable) 运行状态(Running) 阻塞状态(Blocked) 凋亡状态(Dead) 其中阻塞状态(Blocked)又分为三种: ...

  3. Java学习笔记之——多线程

    多线程编程 程序: 进程:一个程序运行就会产生一个进程 线程:进程的执行流程,一个进程至少有一个线程,称为主线程 如:QQ聊着天,同时在听音乐 一个进程可以有多个线程,多个线程共享同一个进程的资源 线 ...

  4. Java学习笔记五:Java中常用的运算符

    Java中常用的运算符 运算符是一种“功能”符号,用以通知 Java 进行相关的运算.譬如,我们需要将变量 score 的值设置为 20 ,这时候就需要一个“=”,告诉程序需要进行赋值操作. Java ...

  5. Java学习笔记五--String(二)String其他方法

    第一节课 // 清除单位字符串开始和结尾空白的副本 String.trim(); 字符串每次更改都会创建新的对象,而不会覆盖原来的字符串,每次拼接都会产生新的String对象,耗时耗内存. java. ...

  6. java学习笔记(5)多线程

    一.简介(过段时间再写,多线程难度有点大) --------------------------------------- 1.进程:运行时的概念,运行的应用程序 2.线程:应用程序内部并发执行的代码 ...

  7. Java 学习笔记(11)——多线程

    Java内部提供了针对多线程的支持,线程是CPU执行的最小单位,在多核CPU中使用多线程,能够做到多个任务并行执行,提高效率. 使用多线程的方法 创建Thread类的子类,并重写run方法,在需要启动 ...

  8. Java学习笔记五——流程控制

    分支结构 Java提供了两种常见的分支控制结构:if语句和switch语句. if语句 if语句使用布尔值或布尔表达式(表达式结果为布尔值),if语句有3中形式: 第一种形式: if (5 > ...

  9. Java 学习笔记 (五) Java Compile\Build\Make的区别

    以下内容引自: http://blog.51cto.com/lavasoft/436216 Compile.Make和Build的区别 原创leizhimin2010-11-30 11:30:20评论 ...

随机推荐

  1. MySQL性能诊断与调优 转

    http://www.cnblogs.com/preftest/ http://www.highperfmysql.com/     BOOK LAMP 系统性能调优,第 3 部分: MySQL 服务 ...

  2. mysql内核 innodb存储引警(卷1)配书 用VS 2003 编绎 mysql-3.23.49 源代码

    作者网址:http://www.innomysql.net/ 1.旧版 mysql-3.23.49-win-src.zip 下载 (***络下载配书源代码)   或者  作者网盘  http://pa ...

  3. Using Windows Server 2012 Backup for Hyper-V Virtual Machines. Error 80780176 - The specified component was not reported by the VSS writer.

    https://social.technet.microsoft.com/Forums/windowsserver/en-US/1a1e0066-f421-43d6-970b-1e20e674cdf9 ...

  4. OLEDB Excel 与C# 的数据流通方法

    一.             名词解释: OleDbCommand 是对数据源执行各种操作的SQL语句或者存储过程,连接access.excel等数据文件进行数据操作时候用到的,其实和sqlcomma ...

  5. Blocks与Dispatch Queue的使用

    block是什么block是一个C level的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似.用于回调函数的地方.两个对象间的通讯.实现轻量级的“代理”. blocks和C语言函数指针的 ...

  6. EF Code First 学习笔记:表映射 多个Entity到一张表和一个Entity到多张表

      多个实体映射到一张表 Code First允许将多个实体映射到同一张表上,实体必须遵循如下规则: 实体必须是一对一关系 实体必须共享一个公共键 观察下面两个实体: public class Per ...

  7. Android图片加载框架最全解析(三),深入探究Glide的缓存机制

    在本系列的上一篇文章中,我带着大家一起阅读了一遍Glide的源码,初步了解了这个强大的图片加载框架的基本执行流程. 不过,上一篇文章只能说是比较粗略地阅读了Glide整个执行流程方面的源码,搞明白了G ...

  8. UVC调试

    USB video class(又称为USB video device class or UVC)就是USB device class视频产品在不需要安装任何的驱动程序下即插即用,包括摄像头.数字摄影 ...

  9. C++运算符重载(友元函数方式)

    我们知道,C++中的运算符重载有两种形式:①重载为类的成员函数(见C++运算符重载(成员函数方式)),②重载为类的友元函数. 当重载友元函数时,将没有隐含的参数this指针.这样,对双目运算符,友元函 ...

  10. 数学图形之罗马曲面(RomanSurface)

    罗马曲面,像是一个被捏扁的正四面体. 本文将展示罗马曲面的生成算法和切图,使用自己定义语法的脚本代码生成数学图形.相关软件参见:数学图形可视化工具,该软件免费开源.QQ交流群: 367752815 维 ...