多线程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
小明结束
小强结束

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值