实现线程的两种方式

《零基础学Java》


  • 实现线程的两种方式

    Java提供了两种方式实现线程,分别为继承 java.lang.Thread类实现 java.lang.Rumnable接口

  • 继承Thread类

    Thread类 是 java.lang包 中的一个类,Thread类的对象用来代表线程,通过继承Thread类创建、启动并执行一个线程。

    Thread类的常用方法:

继承Thread类 实例:

public class Demo {
    public static void main(String[] args) {
        Thread a = new ThreadA();
        a.start();

        Thread b = new ThreadB();
        b.start();
    }
}


class ThreadA extends Thread{//ThreadA 继承 Thread类
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(i);
            try {
                Thread.sleep(1000);//休眠(停顿)1000毫秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}


class ThreadB extends Thread{//ThreadB 继承 Thread类
    @Override
    public void run() {
        for (char i = 'a'; i < 'z'; i++) {
            System.out.println(i);
            try {
                Thread.sleep(1000);//休眠(停顿)1000毫秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 实现Runnable接口

    如果当前类不仅要继承其他类(非Thread类),还要实现多线程,那么只能通过当前类实现Runnable接口创建Thread类对象

    实现Runnable接口的程序会创建一个Thread对象,并将Runnable接口的对象target作为其运行对象。

    Thread类的构造方法:

    构造方法 介绍
    public Thread(Runnable target); 创建一个新的 Thread 对象。
    public Thread(Runnable target , String name); 创建一个新的 Thread 对象,并指定名字。

    实现Runnable接口 实例:

    import javax.swing.*;
    import java.awt.*;
    
    public class Demo1 extends JFrame implements Runnable {
        private JLabel jLabel = new JLabel();
        private int count = 0;
        private Container c = getContentPane();
    
        public Demo1(){
            setBounds(400,200,250,100);
            c.setLayout(null);
            try{
                Icon icon = new ImageIcon("src/setting.png");
                jLabel.setIcon(icon);
            }catch (NullPointerException e){
                System.out.println("图片不存在");
                return;
            }
            jLabel.setHorizontalAlignment(SwingConstants.LEFT);
            jLabel.setBounds(10,10,200,50);
            jLabel.setOpaque(true);
            c.add(jLabel);
            setVisible(true);
        }
    
        public static void main(String[] args) {
            Demo1 demo1 = new Demo1();
            Thread thread = new Thread(demo1);
            thread.start();
        }
    
        @Override
        public void run() {
            int i = 10;
            while (true){
                jLabel.setBounds(i,10,200,50);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                i+=5;
                if (i>=200){
                    i=10;
                }
            }
        }
    }
    
posted on 2022-04-09 22:56  TeaTracing  阅读(183)  评论(0编辑  收藏  举报