一:创建多线程的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占用率上涨。