从零开始java多线程到分布式锁(四):java中如何创建多线程

一:创建多线程的4种方法

jdk中有4种方法创建多线程:

(1)实现Runable接口

(2)集成Thread类

(3)线程池创建有返回值的callable

(4)线程池的创建(通过jdk的框架)

 

二:实现Runable接口

package manyThread;

/**
 *实现Runable实现多线程
 * @author monxz
 *
 */
public class Implruable{


	public static void main(String[] args) {

		//模拟多线程
		for(int  i = 0 ; i < 5 ; i++){
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					
					try {
						System.out.println("====多线程开始=======");
						Thread.sleep(1000);
						System.out.println("====多线程结束=======");
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					
				}
			}).start();
		}
	}
}

三:继承thread

package manyThread;

/**
 * 继承Thread实现多线程
 * @author monxz
 *
 */
public class ExtendThread extends  Thread{
	@Override
	public void run() {
		
		try {
			System.out.println("====多线程开始=======");
			Thread.sleep(1000);
			System.out.println("====多线程结束=======");
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
	
	public static void main(String[] args) {
		for(int i = 0 ; i < 5  ;i++){
			new ExtendThread().start();
		}
		
	}
}

四:callable实现有返回值

package manyThread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * callable和FutureTask 创建有返回值的多线程
 * 步骤分为3步
 * (1)创建线程执行主体:实现callable接口,重写其中的方法
 * (2)创建线程包装类:使用FutureTask创建线程接口实现的实例
 * (3)创建执行线程:使用FutureTask执行线程
 * @author monxz
 * @param <T>
 *
 */
public class CallableThread implements Callable<Object>{
	

	
	/**
	 * 实现callabale接口
	 */
	@Override
	public Object call() {
		Integer res = 0;
		try {
					
			for( int  i = 0 ; i < 5 ; i++ ){
				res++;
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		return  res;
	}

	public static void main(String[] args) throws InterruptedException, ExecutionException {
		//创建callable实现的实例
		CallableThread   ct  = new CallableThread();
		//
		FutureTask<Object>   fTask = new FutureTask<>(ct);
		
			new Thread(fTask).start();
		
		
		
		System.out.println(fTask.get());
	}
}

五:线程池实现多线程

  这个会在下节做出很详细的说明

 

六:总结

  通过以上几种方式可以实现java中的多线程。但是有以下一些问题需要我们特别注意的:

(1)无法控制原子性

  即什么意思呢?就是5个线程,每一个线程都是计算一个数加5次,那么5个线程应该这个数被加了25次,但是上面的几个代码多不能保证一定加了25次。这里需要我们去解决多线程中的原子性问题? 在后面,我们会详细讲解如何使用锁解决原子性问题的

 

(2)手动创建线程一定要关闭

  上面除了线程池的方法(因为无论java或者还是spring都有针对线程池的框架)其他方法一定要在线程结束后关闭线程,否则会导致cpu占用率上涨。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值