作者:「已注销」 链接:https://www.zhihu.com/question/33515481/answer/58849148. 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
忽略这一段文字,错误的地方我后面会修改。实例化线程对象后(这里我不明白,他到底是start启动线程后对象才实例出来,还是说在调用某一线程的start方法之前就已经实例了,和代码给我的感觉相冲突的,继续查资料),启动线程(start方法),某一线程对象的才会开始执行run方法
package com.threadtest.test; import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JProgressBar; public class threadTest extends JFrame { /** serialVersionUID说明 * Java自带的序列化程序在序列化对象时,会将对象的类的信息联通对象本身实例信息(成员变量值) * 一起序列化到字节流中。 * 反序列化时,会根据这些类信息来还原(创建)出新对象。反序列化程序会根据serialVersionUID这 * 个常量值来判断反序列得到的类信息是否与原来的一致。如果我们不指定serialVersionUID的值,序 * 列化程序将把当前类的hashCode值赋给他 */ private static final long serialVersionUID = 1L; private Thread thA; private Thread thB; final JProgressBar progA = new JProgressBar(); final JProgressBar progB = new JProgressBar(); int count = 0; /* synchronized void doit() { }*/ /** * 两个进度条线程测试 * @param args */ public static void main(String[] args) { init(new threadTest(), 100, 100); } public threadTest() { super(); getContentPane().add(progA, BorderLayout.NORTH); getContentPane().add(progB, BorderLayout.SOUTH); progA.setStringPainted(true); progB.setStringPainted(true); //进度条显式数字字符 //A线程run方法覆写 //匿名内部类形式进行初始化 thA = new Thread(new Runnable() { int count = 0; @Override public void run() { //覆写run方法 while(true) { progA.setValue(++count); try { Thread.sleep(100); //休眠(阻塞)0.1s System.out.println("A、"); /** * join方法:当某个线程使用join方法加入到另一个线程时 * 另一个线程会等待该线程执行完毕后再继续执行上一个线程 */ thB.join(); //B线程开始执行 } catch (Exception e) { // TODO: handle exception } } } }); thA.start(); System.out.println("A线程启动"); //B线程run方法覆写 thB = new Thread(new Runnable() { int count = 0; public void run() { while(true) { progB.setValue(++count); try { Thread.sleep(100); //停留 System.out.println("B、"); } catch (Exception e) { // TODO: handle exception } if(count == 100) break; } } }); thB.start(); System.out.println("B线程启动"); } //初始化界面相关 public static void init(JFrame frame, int width, int height) { frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(width, height); frame.setVisible(true); } } 当注释join方法时,两进程几乎是同时进行的 不注释掉join方法,则先按照上面描述一样进行