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
小明結束
小強結束