マルチスレッド1粒


備考:小可08年の紙ノートから、紙が腐りそうになったので、これをここに写して、時々必要なものだけを用意して、いくつかのコード料理は何時までで、娯楽だけに供します.
package nie.test.util.thread;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class TestJProgressBar {
	static long begin,end;
	JProgressBar bar = new JProgressBar(JProgressBar.HORIZONTAL ,0,1000);

	public TestJProgressBar() {
		JFrame frame = new JFrame("progress_bar_show");
		bar.setStringPainted(true);	//1. 
		bar.setString("0%");		//2. 
		bar.setValue(0);			//3. 
		
		frame.add(bar,BorderLayout.CENTER);	
		
		frame.setBounds(400, 500, 400, 150);
		frame.pack();
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Progress p1 = new Progress();
		begin = System.currentTimeMillis();
		/*
		i=1	->	 :Thread_0:49.636
		i=10 ->	 5 。
				 :Thread_7:5.124
				 :Thread_5:5.14
				 :Thread_3:5.155
				 :Thread_2:5.171
				 :Thread_9:5.171
				 :Thread_1:5.171
				 :Thread_8:5.171
				 :Thread_4:5.202
				 :Thread_6:5.202
				 :Thread_0:5.218
		 */
		for(int i=0;i<10;i++){
			Thread t=new Thread(p1);
			t.setName("Thread_"+i);
			t.start();
		}
		
	}

	class Progress implements Runnable{
		int i=0;
		@Override
		public void run() {
			 while(i<=1000) {
					try {
						Thread.sleep((int)(Math.random()*100));
						bar.setString(i+"‰");
						if(i==1000){
							end = System.currentTimeMillis();
							break;
						}
						bar.setValue(i++);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			 System.out.println(" :"+Thread.currentThread().getName()+":"+(end-begin)/1000.0);	
		}
	}
	
	public static void main(String[] args) {
		new TestJProgressBar();
	}
}

複数のスレッドが同時に1つのことをし、同じメンバー変数にアクセスします.
プログレスバーで表示するとより鮮明で直感的ですよ.