多线程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
小明结束
小强结束
解决线程安全问题可用锁(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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python3写爬虫(四)多线程实现数据爬取
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- 谷歌 Project Zero 团队宣布新政策,漏洞披露前将有完整的 90 天缓冲期
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序