视频地址:https://www.imooc.com/learn/312
源码地址(github):https://github.com/Lining128/xiancheng
线程创建的两种方法:
两种方式的比较:
Runnable方式可以避免Thread方式由于Java单继承特性带来的缺陷
Runnable的代码可以被多个线程(Thread)共享,适合于多个线程处理同一资源的情况
Thread方式:
package com.demo.thread;
class MyThread extends Thread{
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);
}
}
}
public class TicketsThread {
public static void main(String[] args) {
//创建三个线程
MyThread mt1 = new MyThread("窗口1");
MyThread mt2 = new MyThread("窗口2");
MyThread mt3 = new MyThread("窗口3");
//启动三个线程
mt1.start();
mt2.start();
mt3.start();
}
}
运行结果:
Runnable方式:
package com.demo.runnable;
class MyThread implements Runnable{
private int ticketsCont = 5;
@Override
public void run(){
while (ticketsCont > 0){
ticketsCont--;
System.out.println(Thread.currentThread().getName() + "卖了1张票,剩余票数为:" + ticketsCont);
}
}
}
public class TicktesRunnable {
public static void main(String[] args) {
MyThread mt = new MyThread();
//创建三个线程
Thread th1 = new Thread(mt,"窗口一");
Thread th2 = new Thread(mt,"窗口二");
Thread th3 = new Thread(mt,"窗口三");
//启动线程
th1.start();
th2.start();
th3.start();
}
}
运行结果:
线程的生命周期:
用户线程:
运行在前台,执行具体任务,线程的主线程、连接网络的子线程等都用户线程
守护线程:
运行在后台、为其他前台线程服务
特点:一旦所有用户线程都会结束运行,守护线程会随jvm一起结束工作
应用:数据库连接池中的监测线程、jvm虚拟机启动后的监测线程、垃圾回收线程
如何设置守护线程:
可以通过Thread类的steDaemon(true)方法来设置当前的线程
注意:setDaemon(true)必须在 start()方法之前调用,否则会抛出IllegalThreadStateExcption异常
在守护线程中产生的新线程也是守护线程
不是所有的任务都可以分配给守护线程来执行,比如读写操作或者计算逻辑
代码实现:
package com.demo.daemmon;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Scanner;
class DaemonThread implements Runnable{
@Override
public void run(){
System.out.println("进入守护线程"+Thread.currentThread().getName());
try {
writeToFile();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("退出守护线程"+Thread.currentThread().getName());
}
private void writeToFile()throws Exception{
File filename = new File("f:"+ File.separator+"daemon.txt");
OutputStream os = new FileOutputStream(filename,true);
int count = 0;
while (count < 999){
os.write(("\r\nword"+count).getBytes());
System.out.println("守护线程"+Thread.currentThread().getName()+"向文件中写入了word"+count++);
Thread.sleep(1000);
}
}
}
public class DaemonThreadDemo {
public static void main(String[] args) {
System.out.println("进入主线程"+Thread.currentThread().getName());
DaemonThread daemonThread = new DaemonThread();
Thread thread = new Thread(daemonThread);
thread.setDaemon(true);
thread.start();
Scanner sc = new Scanner(System.in);
sc.next();
System.out.println("退出主线程"+Thread.currentThread().getName());
}
}
运行结果: