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