继承Thread
package Mon;
import java.security.PublicKey;
/**
* @author Osiris
* @date 2020/12/21 13:48
*/
public class Tus {
public static void main(String[] args) {
Ticket t1=new Ticket();
Ticket t2=new Ticket();
Ticket t3=new Ticket();
Ticket t4=new Ticket();
t1.setName("窗口一");
t2.setName("窗口二");
t3.setName("窗口三");
t4.setName("窗口三");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Ticket extends Thread{
private static int ticket=20;
@Override
public void run() {
while(true){
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"线程卖出了第"+ticket--+"张票");
}else {
System.out.println(Thread.currentThread().getName()+"已卖光");
break;
}
}
}
}
实现Runable
package Mon;
public class Tus {
public static void main(String[] args) {
MyRunnable1 mt = new MyRunnable1();
Thread t1 = new Thread(mt);
Thread t2 = new Thread(mt);
Thread t3 = new Thread(mt);
Thread t4 = new Thread(mt);
t1.setName("第一窗口:");
t2.setName("第二窗口:");
t3.setName("第三窗口:");
t4.setName("第四窗口:");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class MyRunnable1 implements Runnable{
private int ticket = 30;
@Override
public void run() {
while(true){
synchronized (MyRunnable1.class) {
if(ticket == 0){
break;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖出第" + ticket-- +"号票!");
}
}
}
}
实现Runnable接口时,数据ticket不需要被static修饰,多线程共享同一个目标对象
实现Runnable接口并不意味着就是线程,所以仍然要new Thread();