**1. 创建线程   **

1.1 通过构造函数:public Thread(Runnable target, String name){}  或:public Thread(Runnable target){}

示例:

1.  Thread thread1 =  new  Thread(new  MyThread(),  "mythread");2.  class  MyThread  extends  Thread(){3.  public  void run(){4.  System.out.println("My First Thread');5.  }6.  }

1.2 直接实现Runnable接口:

示例:

1.  Thread thread2 =  new  Thread(new  Runnable{}{2.  public  void run(){3.  System.out.println("This is my thread.");4.  }5.  });

**2. 运行线程   **

thead1.start()

3. sleep

1.  try{2.  #休眠1000ms3.  Thread.sleep(1000);4.  }catch(InterruptedException e){5.  e.printStackTrace();6.  }

4. getName() 获取线程名字, getId()获取线程id

System.out.println(Thread.currentThread().getName() + “:”+ Thread.currentThread().getId);

5. 停止线程,

千万不用stop(),stop会立即终止线程。

通过interrupt()中断线程,但是中断并没有停止线程,配合异常来实现:

1.  public  class  Main  {2.  public  static  void main(String[] args)  throws  InterruptedException  {3.  try{4.  Thread thread1=new  Thread(new  TheThread(),"thread1");5.  thread1.start();6.  Thread.sleep(2000);7.  thread1.interrupt();8.  }catch  (InterruptedException e){9.  e.printStackTrace();10.  }11.  }12.  }13.  class  TheThread  extends  Thread{14.  public  void run()  {15.  super.run();16.  for  (int i =  0; i <  10; i++)  {17.  if(this.interrupted()){18.  break;19.  }20.  System.out.println(Thread.currentThread().getName()  +  ":"  + i);21.  }22.  }23.  }

注意,如果在TheThread类里加入catch InterruptException的话,可能会导致interrupt被捕获,而绕过if(this.interrupted())的判断而无法终止线程。

6. 等待和通知

线程等待:当前线程就处于等待状态,直到其他线程调用了notify()方法,线程才会继续执行

1.  public  final  void wait()  throws  InterruptedException

线程通知:

1.  public  final  native  void notify()

注意:在notify()方法后,当前线程不会马上释放该对象锁,要等到执行notify()方法的线程将程序执行完,也就是退出同步代码块中。

1.  package wait.notify;3.  public  class  ThreadWaitNotifyTest  {4.  final  static  Object  object=new  Object();5.  public  static  class T1 extends  Thread{6.  public  void run(){7.  System.out.println(System.currentTimeMillis()+": T1 start");8.  synchronized  (object){9.  try  {10.  System.out.println(System.currentTimeMillis()+": T1 wait");11.  object.wait();12.  }  catch  (InterruptedException e)  {13.  e.printStackTrace();14.  }15.  }16.  System.out.println(System.currentTimeMillis()+": T1 end");17.  }18.  }19.  public  static  class T2 extends  Thread{20.  public  void run(){21.  System.out.println(System.currentTimeMillis()+": T2 start");22.  synchronized  (object){23.  System.out.println("T2 synchonized code start.");24.  object.notify();25.  try  {26.  Thread.sleep(2000);27.  }  catch  (InterruptedException e)  {28.  e.printStackTrace();29.  }finally{30.  System.out.println("T2 synchonized code end.");31.  }33.  }34.  try  {35.  Thread.sleep(2000);36.  }  catch  (InterruptedException e)  {37.  e.printStackTrace();38.  }39.  System.out.println(System.currentTimeMillis()+": T2 end");40.  }41.  }42.  public  static  void main(String[] args){43.  Thread thread1=new T1();44.  Thread thread2=new T2();45.  thread1.start();46.  thread2.start();47.  }48.  }

输出结果:

7. 线程优先级

高优先级的线程将会获得更多的CPU资源。一共分为10个优先级。

public final void setPriority(int newPriority)

源码分析:

1.  public  final  void setPriority(int newPriority)  {2.  ThreadGroup g;3.  checkAccess();4.  if  (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY)  {5.  throw  new  IllegalArgumentException();6.  }7.  if((g = getThreadGroup())  !=  null)  {8.  if  (newPriority > g.getMaxPriority())  {9.  newPriority = g.getMaxPriority();10.  }11.  setPriority0(priority = newPriority);12.  }13.  }
1.  public  final  static  int MIN_PRIORITY =  1;2.  public  final  static  int NORM_PRIORITY =  5;3.  public  final  static  int MAX_PRIORITY =  10;

可见线程最高优先级为10, 最低为1, 默认为5.

当设定的newPriority高于该线程组ThreadGroup的最高Priority时,只能分配该线程组的最高Priority

8. 守护线程

类似守护进程,Java存在两种线程:用户线程和守护线程。它是一种特殊线程,执行的是一种后台服务,当一个系统中不存在非守护线程的时候,守护线程会自己销毁。典型的守护线程:JVM的垃圾回收线程。

public final void setDaemon(boolean on)

示例:

1.  public  class  Main  {2.  public  static  void main(String[] args)  throws  InterruptedException  {3.  TheThread theThread=new  TheThread();4.  theThread.setDaemon(true);//设置守护线程5.  theThread.start();6.  Thread.sleep(5000);7.  System.out.println("全都退出啦");8.  }9.  public  static  class  TheThread  extends  Thread{10.  public  void run(){11.  int i =  0;12.  while  (true){13.  i++;14.  System.out.println(Thread.currentThread().getId()+":"+i);15.  try  {16.  Thread.sleep(2000);17.  }  catch  (InterruptedException e)  {18.  e.printStackTrace();19.  }20.  }21.  }22.  }23.  }

源码分析:

设置线程为用户线程(user thread)或守护线程(daemon thread),当剩余运行的线程均为守护线程时,JVM会退出。

1.  public  final  void setDaemon(boolean on)  {2.  checkAccess();3.  if  (isAlive())  {4.  throw  new  IllegalThreadStateException();5.  }6.  daemon = on;7.  }

其中checkAccesss()方法如下:

1.  public  final  void checkAccess()  {2.  SecurityManager security =  System.getSecurityManager();3.  if  (security !=  null)  {4.  security.checkAccess(this);5.  }6.  }

该方法用于判断当前运行的线程是否有修改此线程的权限。

而public final native boolean isAlive();用于判断该线程是否处于alive状态,即该线程是否已经start,且没有die。

当isAlive的话就会抛出IllegalThreadStateException异常。

所以,设置守护线程的方法,逻辑就是先判断当前线程是否有修改的权限,再判断是否处于alive状态,如果不处于alive状态,则根据boolean变量on的值更改它的状态,即true:设为daemon线程,false:设为user线程。

【Java进阶营】Java多线程基础学习(一)相关推荐

  1. java多线程基础学习[狂神说java-多线程笔记]

    java多线程基础学习 一.线程简介 1.类比 2.程序进程线程 3.线程的核心概念 二.线程的实现(重点) 调用方法与调用多线程的区别 Thread 类 1.thread使用方法 2. 代码实现 3 ...

  2. 【Java进阶营】Java是什么?Java的特点有哪些?

    IT程序员现在几乎是薪资高,前景好的行业象征,无论是国内还是国外,IT行业的程序员.工程师,甚至连码农都要比其他行业的从业者的收入高很多!尤其是作为IT界的"常青树"Java,起薪 ...

  3. 【Java进阶营】膜拜 13万字 腾讯高工手写JDK源码笔记带你飙向实战

    灵魂一问,我们为什么要学习JDK源码? 当然不是为了装,毕竟谁没事找事虐自己 - 1.面试跑不掉.现在只要面试Java相关的岗位,肯定或多或少会会涉及JDK源码相关的问题. 2.弄懂原理才不慌.我们作 ...

  4. 零基础是学java还是python-老男孩零基础学习|python和java那个更有发展前景?

    python和java该如何选择?学习哪个更好呢?这对于很多人来说都是非常困扰的问题,也是很多IT从业者都比较关注的问题啊,很多人都知道python和java都是比较受欢迎的开发语言,目前在互联网上需 ...

  5. 用java制作心理测试软件_0基础学习制作app

    学会app制作通常需要多长时间,零基础 如果从目的上来说的话!我有2个建议; 1.用追信魔盒APP制作平台,这个平台可以设置RSS网络链接,对新闻的各个分类也可以做排版. 2.用应用公园APP开发制作 ...

  6. 【Java进阶营】Java面试题收集

    1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Client/Server),客户端/服务端,桌面应用程序 2.你所知道网络协议有那些? H ...

  7. java catch空指针异常处理_Java基础学习:java文件空指针异常处理

    在Java编程中,我们或多或少地会遇到一些程序异常的情况,为了不影响程序的正常执行,我们需要在程序发生异常的情况下,进行一些操作来防止造成更大的损失.例如在我们平时的除法运算中,被除数是不能为0的,如 ...

  8. 【Java进阶营】今天面了一个大学生:这82道SpringBoot面试题都答不上来?还想进大厂?

    Spring Boot面试题 1.什么是Spring Boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问页面,我们就会看到可以在我们的应用程序中使用的所有Spring项目的不同 ...

  9. 【Java进阶营】2022年Java框架排行榜,谁居榜首?

    诞生于1995年的Java,目前已在134,861个网站上广泛使用,包括ESPN.SnapDeal等.在其24年的成长史中,Java已经证明了自己是用于自定义软件开发的顶级通用编程语言. Java广泛 ...

  10. java数据类型转换方向_java基础学习篇02(数据类型转换和基本面试题)

    JAVA基本数据类型转换 java中的数据类型,分为,引用数据类型和基本数据类型.基本数据类型有8中 整型:byte 8位 . short 16位 .int 32位 .long 64位. (8位=1个 ...

最新文章

  1. 2021年春季学期-信号与系统-第十次作业参考答案-第三小题
  2. 消控中心人员配置_建筑能耗监测系统集中化运行管理模式和人员配置!
  3. 在Windows下使用webpack入门
  4. DVWA---文件包含
  5. 使用Reactor进行反应式编程最全教程
  6. DFS应用——找出无向图的割点
  7. NOIP2011提高组day2
  8. 64位处理器_电脑操作系统的32位和64位有什么区别
  9. AI算法连载22:统计之边际概率推断
  10. 导出excel数字前面的0消失_Excel操作中常见的3大坑你遇到过吗?遇到应该这么解决...
  11. 2022年Java程序设计讲课笔记
  12. YUM只下载软件不安装的设定
  13. JetBrains系列IDE创建文件模板
  14. ubuntu20.04 下查看(改变)本地端口开放情况,开启和关闭防火墙
  15. cv2.error: OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wwma2wne\opencv\module
  16. Algs4-1.5.11实现加权quick-find算法
  17. 西部数据硬盘官网查询
  18. linux centos7 下ruby 下载安装
  19. python猴子分桃问题_阶乘
  20. android与pc的连接

热门文章

  1. The Use Case Definition in UML
  2. mac自带的python怎么升级_mac上怎么更新python
  3. Centos7.6环境Docker安装Oracle19c企业版
  4. 微型计算机生产制约因素,精品解析:广东省东莞市2019-2020学年高三下学期第一次统考(5月)模拟考试文科综合地理试题...
  5. 李大勇matlab视频解压密码,13.4 环境控制、手动开关模块
  6. python中unstack_Python pandas.DataFrame.unstack函数方法的使用
  7. maven添加子工程_Maven建立父子项目和跨项目调用内容的步骤—佳佳小白
  8. c语言case多种情况,switch语句中有多种情况
  9. stm32——modbus例程网址收藏
  10. Java日志框架介绍