zoukankan      html  css  js  c++  java
  • Java中如何创建线程

    Java中如何创建线程

      两种方式:1)继承Thread类;2)实现Runnable接口。
      1.继承Thread类
      继承Thread类,重写run方法,在run方法中定义需要执行的任务。
    class MyThread extends Thread{
    private static int num = 0;
    public MyThread(){
    num++;
    }
    @Override
    public void run() {
    System.out.println("主动创建的第"+num+"个线程");
    }
    }
    //创建线程对象,start()方法启动线程。
    public class Test {
    public static void main(String[] args) {
    MyThread thread = new MyThread();
    thread.start();
    }
    }
     
     
       在上面代码中,通过调用start()方法,就会创建一个新的线程了。为了分清start()方法调用和run()方法调用的区别,请看下面一个例子:
    public class Test {
    public static void main(String[] args) {
    System.out.println("主线程ID:"+Thread.currentThread().getId());
    MyThread thread1 = new MyThread("thread1");
    thread1.start();
    MyThread thread2 = new MyThread("thread2");
    thread2.run();
    }
    }
     
     
    class MyThread extends Thread{
    private String name;
    public MyThread(String name){
    this.name = name;
    }
    @Override
    public void run() {
    System.out.println("name:"+name+" 子线程ID:"+Thread.currentThread().getId());
    }
    }
       运行结果:
      结论:
      1)thread1和thread2的线程ID不同,thread2和主线程ID相同,说明通过run方法调用并不会创建新的线程,而是在主线程中直接运行run方法,跟普通的方法调用没有任何区别;
      2)虽然thread1的start方法调用在thread2的run方法前面调用,但是先输出的是thread2的run方法调用的相关信息,说明新线程创建的过程不会阻塞主线程的后续执行。
      2.实现Runnable接口
      实现Runnable接口必须重写其run方法。
    下面是一个例子:
    public class Test {
    public static void main(String[] args) {
    System.out.println("主线程ID:"+Thread.currentThread().getId());
    MyRunnable runnable = new MyRunnable();
    Thread thread = new Thread(runnable);
    thread.start();
    }
    }
     
     
    class MyRunnable implements Runnable{
    public MyRunnable() {
    }
    @Override
    public void run() {
    System.out.println("子线程ID:"+Thread.currentThread().getId());
    }
    }
       Runnable的中文意思是“任务”,顾名思义,通过实现Runnable接口,我们定义了一个子任务,然后将子任务交由Thread去执 行。注意,这种方式必须将Runnable作为Thread类的参数,然后通过Thread的start方法来创建一个新线程来执行该子任务。如果调用 Runnable的run方法的话,是不会创建新线程的,这根普通的方法调用没有任何区别。
      事实上,查看Thread类的实现源代码会发现Thread类是实现了Runnable接口的。
      直接继承Thread类的话,可能比实现 Runnable接口看起来更加简洁,但是由于Java只允许单继承,所以如果自定义类需要继承其他类,则只能选择实现Runnable接口。
  • 相关阅读:
    HTTP协议 (二) 基本认证
    HTTP协议详解
    Wireshark基本介绍和学习TCP三次握手
    Fiddler 教程
    UNIX网络编程——线程池模式比较(ICE线程池模型和L/F领导者跟随者模式)
    修改一行SQL代码 性能提升了100倍
    修改一行SQL代码 性能提升了100倍
    vector map 多层嵌套使用
    vector map 多层嵌套使用
    应该记住的话
  • 原文地址:https://www.cnblogs.com/zsqfightyourway/p/7064712.html
Copyright © 2011-2022 走看看