ava多线程和C++里面的多线程有些地方不一样。

毕竟套了一个java虚拟机。对此记录下。

Java语言内置多线程支持:

一个java程序实际上是一个JVM进程。

JVM用一个主线程来执行main()方法。

在main()方法中又可以启动多个进程。

Java多线程创建MyThread类逻辑:

1. 从Thread派生;

2. 覆写run()方法;

3. 创建MyThread实例;

4. 调用start()启动线程。

创建一个线程对象,并启动一个线程。

Thread t = new Thread();
t.start();

如果一个类已经从某个类派生,无法从Thread继承,那么需要的逻辑:

1. 实现Runable接口;

2. 覆写run()方法;

3. 在main()方法中创建Runnable实例;

4. 创建Thread实例并传入Runnable;

5. 调用start()启动线程。

如下代码:

class Thread1 extends Thread{String name;public Thread1(String name){this.name = name;}@Overridepublic void run() {for(int i = 0; i < 5; i++){System.out.println("[" + Thread.currentThread().getId() + "]" + " " + name);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}public class Main1 {public static void main(String[] args){Thread1 t1 = new Thread1("线程1");t1.start();Thread1 t2 = new Thread1("线程2");t2.start();System.out.println("Over!");}
}

程序运行截图如下:

这里要注意:为什么主线程已经结束了,子线程还在跑。

Java没有严格的主线程和子线程的概念。除非主线程终止了子线程,否则子线程会一直执行。

下面是线程的优先级:

可以对线程设置优先级Thread.setPriority(int n)// 1~10,默认为5

优先级高的线程被操作系统调度优先级高

不能通过设置优先级来确保先后顺序。

Java多线程的状态:

New(新创建)、Runnable(运行中)、Blocked(被阻塞)、Waiting(等待)、Timed Waiting(计时等待)、Terminated(已种子)

线程终止的原因:

run()方法执行到return语句返回(线程正常结束)

因为未捕获的移除导致线程终止(线程意外终止)

对某个线程的Thread实例调用stop()方法强制终止(不推荐)

如下代码:

class MyThread extends Thread{String name;public MyThread(String name){this.name = name;}@Overridepublic void run() {for(int i = 0; i < 5; i++){System.out.println("[" + Thread.currentThread().getId() + "]" + " " + name);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}public class Main2 {public static void main(String[] args) throws InterruptedException {MyThread myThread = new MyThread("线程");System.out.println("线程");myThread.start();myThread.join();    //等待myThread执行结束System.out.println("END");}
}

程序运行截图如下:

如果线程需要执行一个长时间任务,就可能需要能中断线程。

中断线程就是其他线程给该线程发一个信号,该线程收到信号后结束执行run()方法。

中断线程需要通过检测inlnterrupted()标志。

其他线程通过调用interrupt()方法中断该线程。

代码如下:

class MyThread2 extends Thread{@Overridepublic void run() {while(!isInterrupted()){System.out.println("[" + Thread.currentThread().getId() + "]" + " " + "Hello");}}
}public class Main3 {public static void main(String[] args) throws InterruptedException {MyThread2 myThread = new MyThread2();myThread.start();Thread.sleep(1000);myThread.interrupt();}
}

程序运行截图如下:

如果线程处于等待状态,该线程会捕获InterruptedException

捕获到InterruptedException说明有其他线程对其调用了interrupt()方法。通常情况下该线程会立刻结束运行

代码如下:

class MyThread3 extends Thread{@Overridepublic void run() {while(!isInterrupted()){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}public class Main4 {public static void main(String[] args){}
}

还可以设置running标志位,这个就和C++里面常用的方法一样。外部通过修改一个成员的状态来让其退出。

但是不同的是,java有个java虚拟机。这个和C++里面的不一样。

要用volatile关键字,如下:public volatile boolean running = false;

Java虚拟机里面,有给主内存的概念,其实任意变量都是在主内存中,当创建了线程后,会在线程中有给变量,这个变量同时也会在主内存中,有一个变量与之对于。

如下:

这样在跟新的时候,就会存中误差。所以就需要volatile关键字:

volatile关键字的目的是告诉虚拟机:

每次访问变量时,总是获取主内存的最新值。

每次修改变量后,立刻回写到主内存。

Volatile关键字解决的是可见性问题:

当一个线程修改了某个共享变量的值,其他线程能够立刻看到修改后的值。

代码如下:

class MyThread5 extends Thread{public volatile boolean running = true;@Overridepublic void run() {while(running){System.out.println("Hello");try {Thread.sleep(100);}catch (InterruptedException e) {e.printStackTrace();System.out.println("InterruptedException");break;}}}
}public class Main5 {public static void main(String[] args) throws InterruptedException {MyThread5 myThread5 = new MyThread5();myThread5.start();Thread.sleep(1000);myThread5.running = false;System.out.println("end");}
}

程序运行截图如下:

源码打包下载地址:https://github.com/fengfanchen/Java/tree/master/MultiThreadInJav

Java笔记-多线程相关相关推荐

  1. 11.1-全栈Java笔记:多线程技术的基本概念

    多线程是JAVA语言的重要特性,大量应用于网络编程.应用于服务器端程序的开发.以及最常见的UI界面底层原理.操作系统底层原理都大量使用了多线程. 我们可以流畅的点击软件或者游戏中的各种按钮,其实,底层 ...

  2. Java笔记-多线程中同步加锁相关

    Java程序入口就是由JVM启动的main线程: main线程又可以启动其他线程.当所有线程都运行结束时JVM退出,进程结束. 守护线程(Daemon):守护线程是为其他线程服务的线程,所有的非守护线 ...

  3. java笔记——多线程笔记

    目录 学习目标: 1.线程简介 普通方法调用和多线程的区别​编辑 Process(进程)与Thread(线程) 本章核心概念 2.线程创建 2.1 三种创建方式 2.2Thread(重点) 2.3Ru ...

  4. Java笔记-多线程协调及ReentrantLock的使用

    这里使用wait/notify去协调线程. 感觉这个比C/C++里面信号量还要好用一点. 使用synchronized没有解决多线程协调问题 public synchronized String ge ...

  5. Java笔记-多线程之线程控制

    线程控制 我们已经知道了线程的调度,接下来我们就可以使用如下方法对象线程进行控制. 1.线程休眠 public static void sleep(long millis):让当前线程处于暂停状态,m ...

  6. 【Java】多线程相关复习—— 线程的创建、名字、运行情况以及顺序控制(join方法) 【一】...

    一.创建线程的三种方式 · 继承Thread类 · 实现Runnable接口 · 实现Callable接口 二. 线程状态 · 线程名字 getName() · 线程活动情况 isAlive() · ...

  7. 分销电影票(Java笔记-多线程)

    代码: 1 public class MainClass { 2 3 public static void main(String[] args) { 4 method1(); 5 } 6 publi ...

  8. Java笔记-Servlet相关记录

    Servlet全称为Server Applect称为小服务程序或服务连接器.主要用于交互式浏览和生成数据,生成动态Web内容. 下面是关于Servlet的生命周期: Servlet的调用要要经过两个过 ...

  9. java笔记 方法_Java笔记-方法

    Java笔记-方法 1.何谓方法 2.方法的定义和调用 package src.method; import java.util.Scanner; public class Demo02 { publ ...

最新文章

  1. C 风格字符串与C++中string类区别
  2. ASP.NET CORE 之 在IIS上部署MVC项目
  3. [Abp vNext 源码分析] - 4. 工作单元
  4. ASP.NET Core 处理 404 Not Found
  5. 使用Spring数据和Thymeleaf实现Bootstrap分页
  6. java的remove iterator_Java集合 iterator.remove()方法详解
  7. Struts2的Action中访问servletAPI方式
  8. 华为员工利用Bug越权访问机密卖给第三方,获利1.6万元,被判有期徒刑一年...
  9. 大数据Hadoop相关概念及其技术生态圈
  10. 统计学和python_深入浅出统计学系列python实现
  11. java缓存技术的介绍
  12. 三相PWM整流器dq解耦控制
  13. java微博模拟登陆_java 模拟登录新浪微博(通过cookie)
  14. OSPF-LSA详解
  15. python类的实例化和继承
  16. OpenCV ERROE **: 02:07:27.741:GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the ...
  17. AutoCAD生成png透明图像
  18. 图解最常用的10个机器学习算法!(必须收藏)
  19. W3150A+评估板--EVB-PIC24用户手册(四)硬件设计指南
  20. 人民日报终发文:国航“避重就轻、不作为、护犊子、体验差、听不进批评”...

热门文章

  1. Linux shell tips and tricks
  2. Oracle中如何删除重复数据
  3. 我用大屏模板做年中可视化报告,惊艳了在场的同事和领导
  4. 互联网“高薪榜”曝光,物联网将接棒?
  5. 如何看待蒂姆·库克在苹果的地位
  6. 在深圳呆那么就感觉伤心了有木有?
  7. 今天的从上往下望去的企业即时通讯
  8. 『无聊透顶』一篇很无聊的文章
  9. 用VC写Assembly代码
  10. Python基本语法,python入门到精通