1:创建线程的两种方式:

继承Thread类


public class MyThread extends Thread {
 @Override
	public void run() {

	}
}
MyThread mt1 = new MyThread();
mt1.start();
实现Runnable 接口

public class MyThread implements Runnable {

	@Override
	public void run() {

	}
}
 MyThread mt = new MyThread();
 Thread th1 = new Thread(mt);
 th1.start();

Runnable方式可以避免有thread方式有java单继承特性带来的缺陷

Runnable方式可以被多个线程实例所共享,适合多个线程处理同一资源的情况

2:具体代码实现
 
public class MyThread extends Thread {

   /** 一共有5张火车票 */   private int ticketsCont = 5;   /** 窗口,也即是线程的名字 */   private String name;

   public MyThread(String name){      this.name = name;   }

   /**    * 写买票逻辑    */   @Override   public void run() {      while(ticketsCont > 0 ){         // 如果还有票,就卖掉一张         ticketsCont--;         System.out.println(name + "卖了1张票,剩余票数为:"+ticketsCont);      }   }}

MyThread mt1 = new MyThread();
mt1.start();

 
 
public class MyThread implements Runnable {

   /** 一共有5张火车票 */   private int ticketsCont = 5;

   /**    * 写买票逻辑    */   @Override   public void run() {      while(ticketsCont > 0 ){         // 如果还有票,就卖掉一张         ticketsCont--;         System.out.println(Thread.currentThread().getName() + "卖了1张票,剩余票数为:"+ticketsCont);      }   }}

MyThread mt = new MyThread();
//创建三个线程,模拟三个窗口卖票

Thread th1 = new Thread(mt,"窗口1");
Thread th2 = new Thread(mt,"窗口2");
Thread th3 = new Thread(mt,"窗口3");

// 启动这三个线程,即窗口开始卖票
th1.start();
th2.start();
th3.start();

3:线程的生命周期
 
 
  创建:创建一个线程对象如Thread th1 = new Thread(mt)
就绪:创建线程对象后,调用了线程的start()方法(此时线程只是进入了线程队列,等待获取CPU服务,具备了运行条件,但并没有开始运行)

运行:处于就绪状态的线程,一旦获取了CPU资源,便进入到运行状态,开始执行run()方法里面的逻辑

终止:线程的run()方法执行完毕,或者线程调用了stop()方法,线程便进入终止状态。

阻塞:一个正在执行的线程在某些情况下,由于某种原因而暂时让出了CPU资源,暂停了自己的执行,便进入了阻塞状态,如调用了sleep()方法。

4:线程的分类

用户线程:运行在前台,执行具体任务

守护线程:运行在后台,为其他前台线程服务。一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作(如数据库连接池中的监测线程,JVM启动后的检测线程)

  守护线程的设置,必须在start()方法前调用setDaemon(true)设置当前线程为守护线程,否则会抛出IllegalThreadStateException异常;守护线程中产生的线程也是守护线程;不是所有的任务都可以分配给守护线程来执行如读写,计算逻辑等(因为守护线程会在用户线程结束后结束)。

5:守护线程例子

DaemonThread类
public class DaemonThread implements Runnable {

   @Override   public void run() {      System.out.println("进入守护线程" + Thread.currentThread().getName());

      try {         writeToFile();      } catch (Exception e) {         System.out.println("守护线程异常:" + e);      }

      System.out.println("退出守护线程" + Thread.currentThread().getName());   }

   private void writeToFile() throws Exception{

      File fileName = new File("d:" + File.separator + "daemon.txt");      // 向文件中追加数据      OutputStream os = new FileOutputStream(fileName,true);      int count = 0;      int totalCount = 999;      while(count < totalCount){         os.write(("\r\nword" + count).getBytes());         System.out.println("守护线程" + Thread.currentThread().getName()             + "向文件中写入了word" + count);         count++;         // 线程休眠1秒         Thread.sleep(1000);      }      os.close();   }

public static void main(String[] args) {

System.out.println("进入主线程" + Thread.currentThread().getName());

DaemonThread daemonThread=new DaemonThread();

Thread th1 = new Thread(daemonThread);
th1.setDaemon(true)
th1.start();

Scanner sc = new Scanner(System.in);
sc.next();
sc.close();

executor.shutdownNow();
System.out.println("退出主线程" + Thread.currentThread().getName());
}

 

6:jstack工具:(是window自带工具,在命令行直接可以使用)

  作用:生成JVM当前时刻线程快照,即当前进程所有线程消息。

  目的:帮助定位程序问题出现的原因,如长时间停顿、CPU占用率过高等。

  使用:在命令行输入jstack pid(进程id,在任务管理器中可以查看到)

 

细说多线程之Thread与Runnable的更多相关文章

  1. 慕课网_细说多线程之Thread VS Runnable

    第1章 课前准备 1-1 前言 (00:49) 第2章 Thread VS Runnable 2-1 回顾线程创建的两种方式 (02:33) 继承Thread类 class MyThread exte ...

  2. 细说多线程之Thread VS Runnable

    [线程创建的两种方式] [线程的生命周期] ● 就绪:创建了线程对象后,调用了线程的start(). (注意:此时线程只是进入了线程队列,等待获取CPU服务,具备了运行的条件,但并不一定已经开始运行了 ...

  3. Java多线程之Thread、Runnable、Callable及线程池

    一.多线程 线程是指进程中的一个执行流程,一个进程中可以有多个线程.如java.exe进程中可以运行很多线程.进程是运行中的程序,是内存等资源的集合,线程是属于某个进程的,进程中的多个线程共享进程中的 ...

  4. 三、多线程之Thread与Runnable的区别

    Thread与Runnable的区别(用三个窗口同时出售10张车票为例子) 运行代码 运行结果 分析 System.out.println("开始测试多线程");class MyT ...

  5. Android线程之Thread 、Runnable 的两个例子

    Thread例子: package fy.test; import android.app.Activity; import android.os.Bundle; import android.os. ...

  6. 多线程编程(三)--创建线程之Thread VS Runnable

    前面写过一篇基础的创建多线程的博文: 那么本篇博文主要来对照一下这两种创建线程的差别. 继承Thread类: 还拿上篇博客的样例来说: 四个线程各自卖各自的票,说明四个线程之间没有共享,是独立的线程. ...

  7. 多线程之thread和runnable

    Runnanle方式可以避免Thread由于单继承特性带来的缺陷. Runnable代码可以被多个线程(thread实例)共享,适用于多个线程处理同一资源的情况. 线程的生命周期:创建,就绪,阻塞,运 ...

  8. Java基础-进程与线程之Thread类详解

    Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...

  9. iOS多线程之Thread

    多线程 • Thread 是苹果官方提供的,简单已用,可以直接操作线程对象.不过需要程序员自己管理线程的生命周期,主要是创建那部分 优缺点 面向对象,简单易用 直接操作线程对象 需要自己管理线程生命周 ...

随机推荐

  1. C# url获取图片流转字符串

    //http url获取图片流转字符串 //string url = serverUrl.TrimEnd('/') + PUrl; //WebRequest request = WebRequest. ...

  2. swagger快速开发

    转载:https://blog.csdn.net/xxoo00xx00/article/details/77163399 swagger 学习笔记 搭建环境: 1,jdk1.8 2,idea 3,sp ...

  3. Python 动态加载 Extension Manager Classes

    看着看着发现了一个库:stevedore(http://stevedore.readthedocs.org/en/latest/managers.html),但是感觉文档做得不行啊,都没个tutori ...

  4. 【代码笔记】Java文件的输入输出(1)——Java.io包的初步理解

    Java里面文件的输入输出全部在java.io包里面. Java.io包里面所有的类都需要掌握. java.io包里面所有的东西都在上面了. 包里面的相关类.异常等树关系如下 类分层结构 java.l ...

  5. Drupal中hook_theme函数用法

    在开发的时候不免要使用到drupal theme 定义.举个简单的例子: 复制代码 代码如下: <?phpfunction modulename_theme() { //开始定义自己的theme ...

  6. css 平行四边

    在视觉设计中,平行四边形往往给人一种动感. 要生成一个平行四边形,只要通过css变形,就可做到: -webkit-transform: skewX(-45deg); 那么生成一个平行四边形的按钮呢?列 ...

  7. 为mongodb添加账号

    进入切换到某一个数据库,我这里是位每个模块分配一个DataBase use 0 执行添加账号命令 db.createUser( { user: "*****", pwd: &quo ...

  8. Android 马甲包制作流程

    一.马甲包的制作流程 1.配置马甲包的applicationId以及应用名称 在app的build.gradle文件中添加马甲包的配置 android { signingConfigs { confi ...

  9. 【起航计划 037】2015 起航计划 Android APIDemo的魔鬼步伐 36 App->Service->Remote Service Binding AIDL实现不同进程间调用服务接口 kill 进程

    本例和下个例子Remote Service Controller 涉及到的文件有RemoteService.java ,IRemoteService.aidl, IRemoteServiceCallb ...

  10. Hive的运算和函数大全

    hive 常用运算 测试各种内置函数的快捷方法: 创建一个 dual 表 create table dual(id string); load 一个文件(只有一行内容:内容为一个空格)到 dual 表 ...