实现线程的两种方式:继承Thread类和实现Runnable接口。
两种方式差异:实现Runnable接口避免单继承的局限性。
继承方式案例:
package com.neutron.thread.demo;
/**
* 继承方式
* 1.继承Thread类
* 2.重写Thread的run方法,将自定义的方法存储在run方法中
* 3.调用线程的start方法,启动线程,调用run方法
*
* 多个线程取得cpu的执行权,cpu执行到谁,谁就运行。多线程具有随机性,谁抢到就执行谁,执行时间不确定。
* Thread类用于描述线程,run方法用于存储线程要执行的代码。
* @author zhanght
*
*/
public class Ticket extends Thread {
private static int ticket = 15;
@Override
public void run() {
while(true) {
if (ticket > 0) {
System.out.println(this.getName() + " " + ticket--);
}
}
}
public static void main(String[] args) {
Ticket ticket = new Ticket();
Ticket ticket2 = new Ticket();
Ticket ticket3 = new Ticket();
ticket.start();
ticket2.start();
ticket3.start();
}
/*
* Thread-1 15
Thread-2 14
Thread-0 14
Thread-2 12
Thread-2 10
Thread-2 9
Thread-2 8
Thread-2 7
Thread-2 6
Thread-1 13
Thread-2 5
Thread-0 11
Thread-2 3
Thread-1 4
Thread-2 1
Thread-0 2
*/
}
实现接口方式:
package com.neutron.thread.demo;
/**
* 1.定义类实现Runnable接口
* 2.重写Runnable接口中的run方法,将线程要运行的代码放在该run方法中。
* 3.通过Thread类建立线程对象
* 4.将实现Runnable接口的子类对象作为实际参数传递给Thread类的构造方法中。
* 要想线程执行指定对象的run方法,那么该对象必须实现Runnable接口
* 5.调用Thread类的start方法,开启线程并且调用实现Runnable接口对象的run方法。
* @author zhanght
*
*/
public class Tickets implements Runnable {
private int ticket = 30;
@Override
public void run() {
while (true) {
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + " " + ticket--);
}
}
}
public static void main(String[] args) {
Tickets t1 = new Tickets();
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
}
/*
* Thread-0 30
Thread-0 29
Thread-0 28
Thread-0 27
Thread-0 26
Thread-1 25
Thread-1 23
Thread-1 22
Thread-1 21
Thread-1 20
Thread-1 19
Thread-1 18
Thread-1 17
Thread-1 16
Thread-1 15
Thread-1 14
Thread-1 13
Thread-1 12
Thread-1 11
Thread-1 10
Thread-1 9
Thread-1 8
Thread-1 7
Thread-1 6
Thread-1 5
Thread-1 4
Thread-1 3
Thread-1 2
Thread-1 1
Thread-0 24
*/
}