博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
细说多线程之Thread与Runnable
阅读量:6762 次
发布时间:2019-06-26

本文共 3508 字,大约阅读时间需要 11 分钟。

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,在任务管理器中可以查看到)

 

转载于:https://www.cnblogs.com/zyy1688/p/10281700.html

你可能感兴趣的文章
ubuntu server 使用parted分区
查看>>
自定义网页日历
查看>>
solr实现满足指定距离范围条件的搜索
查看>>
ubuntu vsftp安装
查看>>
[转载]Web前端研发工程师编程能力飞升之路
查看>>
Redis
查看>>
XINS 3.0 正式版发布,远程 API 调用规范
查看>>
sqlserver 2005 64bit express
查看>>
(转)Oracle中For和while及一些应用
查看>>
jQuery基础及选择器
查看>>
DragonFly BSD 3.2 发布
查看>>
Mozilla 发布 Popcorn Maker,在线创作视频
查看>>
C#中为什么需要装箱拆箱操作?
查看>>
PHP类中一般方法与静态方法的疑问
查看>>
[转]PHP花括号变量
查看>>
【Opencv学习】摄像头采集、录像、截图小工具
查看>>
Fedora16安装中文语言包和中文输入法
查看>>
Windows 8实用窍门系列:14.windows 8中粘贴板(剪切板)的使用
查看>>
长连接API小心“窜包”问题
查看>>
开发者基础知识游戏,共10关,欢迎挑战
查看>>