您的位置:首页 > 编程语言 > Java开发

多线程Java

2016-07-18 16:15 519 查看
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

小明结束

小强结束
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 线程 java 安全