线程的两个创建方法

1.继承Thread类

2.实现Runnable接口


一、继承Thread类

说明:继承Thread类,重写run()方法,调用start()方法启动线程。

public class Example02 {
public static void main(String[] args) {
MyThread myThread=new MyThread();
myThread.start();
while(true){
System.out.println("main方法在运行");
}
}
}
class MyThread extends Thread{
@Override
public void run() {
while(true){
System.out.println("MyThread的方法在运行");
}
}
}

结果:

线程的两个创建方法_第1张图片

二、实现Runable接口

说明:java中类只能单继承,当需要继承其他类又需要实现接口时,可以实现Runable接口来实现多线程。

Thread类中有Thread(Runable target)的构造函数,只需要传递一个Runable的实例对象就可以创建线程了。

public class Example03 {
public static void main(String[] args) {
MyThread1 myThread=new MyThread1();
Thread thread=new Thread(myThread);
thread.start();
while(true){
System.out.println("main的程序正在运行");
}
}
}
class MyThread1 implements Runnable{
public void run(){
while(true){
System.out.println("MyThread类的run方法在运行");
}
}

}

两个线程的区别:

每使用一次new Thread()就会创建一个实例对象,所有的数据都是独立的,相当于创建了多个程序,当需要共享资源时,就会要求在一个程序中实现多线程,实现Runnable接口时,使用的是new Thread(Runnable target),只使用一个对象,从而实现资源的共享。

Runnable的优势:

实现资源的共享,体现了面向对象的思想。

可以避免单继承带来的局限性。

Runnable()实现资源共享的例子:

package study;
public class Example05 {
public static void main(String[] args) {
TicketWindow tw=new TicketWindow();
    new Thread(tw,"窗口1").start();
    new Thread(tw,"窗口2").start();
    new Thread(tw,"窗口3").start();
    new Thread(tw,"窗口4").start();

}


}
class TicketWindow implements Runnable{
private int tickets=100;
@Override
public void run() {

// TODO Auto-generated method stub
while(true){
if(tickets>0){
Thread th=Thread.currentThread();
String th_name=th.getName();
System.out.println(th_name+"正在发售第"+tickets--+"张票");
}
}
}
}

结果:

线程的两个创建方法_第2张图片

该例子实现了tickets资源的共享。

但是当把int tickets=100;放在run内部的时候,就会造成即资源不共享的情况,和继承Thread类时的问题相似的结果,原因是每次都调用了run()方法

实例:

package study;
public class Example05 {
public static void main(String[] args) {
TicketWindow tw=new TicketWindow();
    new Thread(tw,"窗口1").start();
    new Thread(tw,"窗口2").start();
    new Thread(tw,"窗口3").start();
    new Thread(tw,"窗口4").start();

}


}
class TicketWindow implements Runnable{

@Override
public void run() {
int tickets=100;
// TODO Auto-generated method stub
while(true){
if(tickets>0){
Thread th=Thread.currentThread();
String th_name=th.getName();
System.out.println(th_name+"正在发售第"+tickets--+"张票");
}
}
}
}

结果:

线程的两个创建方法_第3张图片


你可能感兴趣的:(简单程序)