这里写自定义目录标题
多线程的创建:
多线程的创建方式一:继承Thread类。
// 1.创建一个继承于Thread的子类
class MyThread extends Thread{
// 2.重写run()方法
@Override
public void run() {
for (int i = 0; i <100 ; i++) {
if(i % 2 == 0){
System.out.println(i);
}
}
}
}
class ThreadTest1 {
public static void main(String[] args) {
// 3.创建子类对象
MyThread t1 = new MyThread();
// 4.调用start()方法
t1.start();// 1.启动当前线程 2.调用run方法。
}
}
运行结果:
注意事项:
1.启动线程应该调用start(),而不是调用run()。
2.如果再启动一个线程,必须重新创建Thread子类的对象,重写该子类的run()。
多线程的创建方式二:实现Runnable接口。
class MThread implements Runnable{
@Override
public void run() {
for (int i = 0; i <100 ; i++) {
if (i % 2 == 0) {
System.out.println(i);
}
}
}
}
public class ThreadTest2 {
public static void main(String[] args) {
MThread m1 = new MThread();
Thread t1 = new Thread(m1);
t1.start(); //调用了Runnable中的target的run();
}
}
运行结果:
两种创建方式的对比:
不同点:
使用继承Thread的方式无法再让Thread子类去继承其他的类,使用Runnable接口可以有实现其他接口的方式,没有类单继承的局限性。
相同点:
都要重写run()。
一般推荐使用实现Runnable接口的方法,需要共享数据时推荐此方法,例如卖票系统。
两种创建方式实现卖票:
// 创建三个窗口买票,总票数为100 张:使用继承Thread的方式。
class Window1 extends Thread{
private static int Ticket = 100;
@Override
public void run() {
while (true){
if(Ticket > 0){
System.out.println(getName() + ":卖票:票号为:" + Ticket);
Ticket--;
}else {
break;
}
}
}
}
public class ThreadTest03 {
public static void main(String[] args) {
Window1 w1 = new Window1();
Window1 w2 = new Window1();
Window1 w3 = new Window1();
w1.setName("窗口1");
w2.setName("窗口2");
w3.setName("窗口3");
w1.start();
w2.start();
w3.start();
}
}
//创建三个窗口买票,总票数为100 张:使用实现Runaable接口的方式。
class Window2 implements Runnable{
private int Ticket = 100;
@Override
public void run() {
while (true){
if(Ticket > 0){
System.out.println(Thread.currentThread().getName() + "卖票:票号为:" + Ticket);
Ticket--;
}else{
break;
}
}
}
}
public class ThreadTest04 {
public static void main(String[] args) {
Window2 w1 = new Window2();
Thread t1 = new Thread(w1);
Thread t2 = new Thread(w1);
Thread t3 = new Thread(w1);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}