多線程Java

Java多線程實現方式,可用類Thread或接口Runnable或者Collabale

解決線程安全問題可用鎖(Lock)或者關鍵字synchronized

例子

1.多線程運行計算

2.兩個線程同時打印數字

3.小明小強搶蘋果問題


Calc類,多線程運行計算

package com.anson.java;

/**
 * 計算Calc
 * @author anson
 *
 */
public class Calc implements Runnable {
	
	private int info=0;
	private String threadName=null;
	private double number1=0;
	private double number2=0;
	
	public Calc()
	{
		
	}
	
	/**
	 * 設置線程名
	 * @param thread
	 */
	public synchronized void setThreadName(Thread thread)
	{
		this.threadName=thread.getName().toString();
		
	}
	
	/**
	 * 設置運算變量值
	 * @param number1
	 * @param number2
	 */
	public synchronized void setNumber(double number1,double number2)
	{
		this.number1=number1;
		this.number2=number2;
	}
	
	/**
	 * 計算結果
	 * info的結果每次都爲0,因爲每次生成的線程只執行一次
	 */
	public  synchronized void Test()
	{
		System.out.println((info++)+" 		"+threadName+"		"+(this.number1+this.number2));
		
	}

	/**
	 * run()方法,運行計算
	 */
	@Override
	public void run() {
		Test();
}
	
}

PrintNumber類,兩個線程同時打印數字

package com.anson.java;

/**
 * 兩個線程打印數字
 * @author anson
 *
 */
public class PrintNumber  implements Runnable{

	private int i=0;

	@Override
	public void run() {
		// TODO Auto-generated method stub
		synchronized(this)
		{
			for(;i<20;i++)
			{
				System.out.println(i+"  	 "+Thread.currentThread().getName());
			}
		}
	
	}

}

Apple類,小明小強搶蘋果問題

package com.anson.java;

/**
 * 小明,小強搶蘋果
 * @author anson
 *
 */

public class Apple implements Runnable {

	private int appleCount=5;

	/**
	 * 拿走一個蘋果
	 * @return
	 */
	 boolean  getApple()
	{

		 synchronized(this)
		 {
				boolean flag=false;
				if(appleCount!=0)
				{
					appleCount--;
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {

						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()+"拿走一個,		還剩"+appleCount);
					flag=true;
				}
			
			return flag;
		 }

	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(getApple())
		{
			
		}
		System.out.println(Thread.currentThread().getName()+"結束");
		}

}


Test類,測試

package com.anson.java;

public class Test {

	/**
	 * 測試使用多線程
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/**
		 * 計算Calc
		 */
		for(int i=0;i<10;i++)
		{
			final Calc calc=new Calc();
			System.out.println(Thread.currentThread().getName());
			Thread thread=new Thread(calc);
			calc.setThreadName(thread);
			calc.setNumber(i, i);
			thread.start();
		}
		/**
		 * 兩個線程打印數字
		 */
		PrintNumber printNumber=new PrintNumber();
		
		Thread thread1=new Thread(printNumber);
		Thread thread2=new Thread(printNumber);

		thread1.start();
    	thread2.start();
		
    	/**
    	 * 小明,小強搶蘋果
    	 */
		Apple apple=new Apple();
		
		Thread thread11=new Thread(apple);
		Thread thread21=new Thread(apple);
		
		thread11.setName("小強");
		thread21.setName("小明");
		thread11.start();
		thread21.start();
	}

}



測試結果:

每次運行結果都不相同

main
main
main
main
main
main
main
main
0         Thread-2        4.0
main
0         Thread-6        12.0
0         Thread-1        2.0
0         Thread-0        0.0
0         Thread-5        10.0
0         Thread-3        6.0
0         Thread-4        8.0
main
0         Thread-8        16.0
0         Thread-7        14.0
0       Thread-10
1       Thread-10
2       Thread-10
3       Thread-10
4       Thread-10
5       Thread-10
6       Thread-10
7       Thread-10
8       Thread-10
9       Thread-10
10       Thread-10
11       Thread-10
12       Thread-10
0         Thread-9        18.0
13       Thread-10
14       Thread-10
15       Thread-10
16       Thread-10
17       Thread-10
18       Thread-10
19       Thread-10
小強拿走一個,        還剩4
小強拿走一個,        還剩3
小明拿走一個,        還剩2
小明拿走一個,        還剩1
小明拿走一個,        還剩0
小明結束
小強結束

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章