swing与多线程的结合

swing与多线程的结合

这篇博客记录java中多线程的学习内容,通过与swing结合加深理解

我之前写过一篇PyQt中的多线程实现方法,感觉与之类似,因此只做简单记录。

雪花向前滚动的实例

代码

package Number;

import javax.swing.*;
import java.awt.*;
import java.net.URL;

public class SwingAndThread extends JFrame implements Runnable{
    
    
    private JLabel jl = new JLabel();
    private static Thread t;
    private Container container = getContentPane();
    private int count = 0;

    public SwingAndThread(){
    
    
        setBounds(300, 200, 250, 100);
        container.setLayout(null);
        URL url = SwingAndThread.class.getResource("/1.gif");
        Icon icon = new ImageIcon(url);
        jl.setIcon(icon);
        jl.setHorizontalAlignment(SwingConstants.LEFT);

        jl.setBounds(10,10,200,50);
        jl.setOpaque(true);

        container.add(jl);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
    
    
        SwingAndThread frame = new SwingAndThread();
        Thread t = new Thread(frame);
        t.start();
    }

    @Override
    public void run() {
    
    
        while(true){
    
    
            jl.setBounds(count, 10, 250, 50);
            count += 5;
            try {
    
    
                Thread.sleep(500);
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
            if(count == 200){
    
    
                count = 10;
            }
        }
    }
}

看看实现效果

QQ录屏20211129092929

线程中添加线程

使用join方法,实现在一个进度条线程A中加入另一个进度条线程B,并在20%时让B先执行,然后继续执行A

直接上代码

package Number;

import javax.swing.*;
import java.awt.*;

public class JoinThread extends JFrame {
    
    
    private Thread A;
    private Thread B;
    final JProgressBar progressBarA = new JProgressBar();
    final JProgressBar progressBarB = new JProgressBar();
    int count = 0;
    private Container c = getContentPane();

    public JoinThread() {
    
    
        super();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setLayout(new BorderLayout());
        setSize(400, 100);
        c.add(progressBarA, BorderLayout.NORTH);
        c.add(progressBarB, BorderLayout.SOUTH);
        progressBarA.setStringPainted(true);
        progressBarB.setStringPainted(true);

        A = new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                int count = 0;
                while (true) {
    
    
                    progressBarA.setValue(++count);
                    try {
    
    
                        Thread.sleep(100);
                        if(count == 20){
    
    
                            B.join();
                        }
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                    if (count == 100) {
    
    
                        break;
                    }
                }

            }
        });
        A.start();

        B = new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                int count = 0;
                while (true) {
    
    
                    progressBarB.setValue(++count);
                    try {
    
    
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                    if (count == 100) {
    
    
                        break;
                    }
                }

            }
        });
        B.start();
    }

    public static void main(String[] args) {
    
    
        new JoinThread();
    }
}

主要知识点:

  • 进度条的设置,JProgressBar是swing中的控件;
  • Runnable接口的实现;
  • 线程B的加入,使用join方法;
  • 线程B完成后,需要使用break,使线程结束,然后继续进行A线程。
  • 另一个需要特殊说明的是,我上一个雪花滚动的线程示例中,在创建类的时候,用implement来实现了Runnable接口,而下面这个并没有这么写,这是因为在前面写implement Runnable后,程序中必须要重写run方法,而这个run方法只有一个,但是我有两个线程都需要重写这个run方法,这个run方法无法区分是A线程还是B线程,因此下面这个实力是在创建线程的时候,直接new的Runnable接口,new的时候,就无需在前面写implement了。

看看实现效果

QQ录屏20211129093035

猜你喜欢

转载自blog.csdn.net/u012848304/article/details/121602929
今日推荐