java多线程编程笔记

继承Thread类,实现多线程

  • java里面提供了一个java.lang.Thread的程序类,那么一个类只要继承了此类就表示这个类为线程的主体类,但是并不是说这个类就可以实现多线程处理了,因为还需要覆写Thread类中提供的一个run()方法(public void run()),而这个方法就属于线程的主方法。
class MyThread extends Thread {//线程主体类
    private String title;
    public MyThread(String title) {
        this.title = title;
    }
    @Override
    public void run() {//线程的主体方法
        for(int x = 0; x < 10 ; x++) {
            System.out.println(this.title + "运行,x = " + x);
        }
    }
}
  • 多线程要执行的功能,都应该在run()方法中进行定义,但是需要说明的是:
    在正常情况下,如果要想使用一个类中的方法,那么肯定要产生实例化对象,而后去调用类中提供的方法,但是run()方法不能直接调用的,因为这牵扯到一个操作系统的资源调度问题,所以要想启动多线程必须使用start()方法。
public class ThreadDemo {
    public static void main(String[] args) {
        new MyThread("线程A").start();
        new MyThread("线程B").start();
        new MyThread("线程C").start();
    }
}
  • 通过此时的调用你可以发现,虽然调用了start()方法,但是最终执行的run()方法,并且所有的线程对象都是交替执行的。执行顺序不可控。

基于Runnable接口实现多线程

  • 虽然可以通过Thread类的继承来实现多线程的定义,但是在Java程序里面对于继承永远都是存在有单继承局限的,所以在Java里面又提供有第二种多线程的主体定义结构形式:实现java.lang.Runnable接口,此接口定义如下:
@FunctionalInterface    // 从JDK1.8引入了Lambda 表达式之后就变为了函数式接口
public interface Runnable {
  public void run();
}
  • 通过Runnable 实现多线程的主体类
class MyThread implements Runnable {//线程主体类
    private String title;
    public MyThread(String title) {
        this.title = title;
    }
    @Override
    public void run() {//线程的主体方法
        for(int x = 0; x < 10 ; x++) {
            System.out.println(this.title + "运行,x = " + x);
        }
    }
}
  • 但是此时由于不在继承Thread父类了,那么对于此时的MyThread类中也就不在支持有start()这个继承方法,可是不使用Thread.start()方法是无法进行多线程启动的,那么这个时候就需要去观察一下Thread类所提供的构造方法了。
public class ThreadDemo {
    public static void main(String[] args) {
        Thread threadA = new Thread(new MyThread("线程A"));
        Thread threadB = new Thread(new MyThread("线程B"));
        Thread threadC = new Thread(new MyThread("线程C"));
        threadA.start();
        threadB.start();
        threadC.start();
    }
}

你可能感兴趣的:(java多线程编程笔记)