public class MyThread extends Thread {
@Override
public void run() {
}
}
MyThread mt1 = new MyThread();
mt1.start();
Posted zyy1688
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了细说多线程之Thread与Runnable相关的知识,希望对你有一定的参考价值。
1:创建线程的两种方式:
继承Thread类
public class MyThread extends Thread {
@Override
public void run() {
}
}
MyThread mt1 = new MyThread();
mt1.start();
public class MyThread implements Runnable {
@Override
public void run() {
}
}
MyThread mt = new MyThread();
Thread th1 = new Thread(mt);
th1.start();
Runnable方式可以避免有thread方式有java单继承特性带来的缺陷
Runnable方式可以被多个线程实例所共享,适合多个线程处理同一资源的情况
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();
运行:处于就绪状态的线程,一旦获取了CPU资源,便进入到运行状态,开始执行run()方法里面的逻辑
终止:线程的run()方法执行完毕,或者线程调用了stop()方法,线程便进入终止状态。
阻塞:一个正在执行的线程在某些情况下,由于某种原因而暂时让出了CPU资源,暂停了自己的执行,便进入了阻塞状态,如调用了sleep()方法。
4:线程的分类
用户线程:运行在前台,执行具体任务
守护线程:运行在后台,为其他前台线程服务。一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作(如数据库连接池中的监测线程,JVM启动后的检测线程)
守护线程的设置,必须在start()方法前调用setDaemon(true)设置当前线程为守护线程,否则会抛出IllegalThreadStateException异常;守护线程中产生的线程也是守护线程;不是所有的任务都可以分配给守护线程来执行如读写,计算逻辑等(因为守护线程会在用户线程结束后结束)。
5:
6:jstack工具:(是window自带工具,在命令行直接可以使用)
作用:生成JVM当前时刻线程快照,即当前进程所有线程消息。
目的:帮助定位程序问题出现的原因,如长时间停顿、CPU占用率过高等。
使用:在命令行输入jstack pid(进程id,在任务管理器中可以查看到)
以上是关于细说多线程之Thread与Runnable的主要内容,如果未能解决你的问题,请参考以下文章
JavaSE学习52:细说多线程之Thread类和Runable接口