实现多线程的方式最常用的有两种,一种是实现runnable接口,另一种是继承thread类。
这里讲一下第一种方式来实现多线程
要想用多线程实现高并发则必须要有一个主线程。
具体步骤如下
1、新建主线程类 MainProcess
在主线程中有一个与子线程进行通信的同步锁,代码中的synchronize修饰符就是为了保证被该修饰符修饰的代码只会被UI个线程执行,在执行过程中其它的线程都会处于等待状态,主线程在产生完子线程之后就进入了等待状态,等待子线程的执行
public class MainProcess {
static Object lock = new Object();//同步锁
public static void main(String[] args) {
int cuindex=0;
Integer allNum=30;
int maxSize = 10;
List<String> list = null;
list= new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
list.add("钱七");
list.add("周八");
list.add("吴九");
list.add("郑旺");
list.add("孙十");
list.add("罗十一");
list.add("袁十二");
list.add("老子");
list.add("庄子");
list.add("悟空");
list.add("八戒");
list.add("沙僧");
SubProcess sp = new SubProcess(lock, list, maxSize, allNum,cuindex);
//产生子线程
for(int i=0;i<maxSize;i++){
Thread sth = new Thread(sp);
sth.start();
}
//主线程等待
synchronized ( lock) {
try {
lock.wait(90000);
cuindex = cuindex+maxSize;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
2、新建子线程类 SubProcess
子线程将实现ruannable接口,子线程中定义对象锁,来源于主线程,当当前已执行完的线程数等于最大线程数后唤醒主线程。
public class SubProcess implements Runnable{
Object lock = null;
List list = null;
Integer allNum=null;
int maxSize;
int currentListIndex;
int currentThreadSNum;//当前开启的线程数
int currentThreadFNum;//当前完成的线程数
public SubProcess(Object lock,List list,int maxSize,Integer allNum,int currentListIndex){
this.lock=lock;
this.list=list;
this.maxSize=maxSize;
this.allNum=allNum;
this.currentListIndex=currentListIndex;
}
@Override
public void run() {
int localThread=0;//当前线程编号
synchronized(this.lock){
currentThreadSNum=currentThreadSNum+1;
localThread=currentThreadSNum;
}
synchronized(this.lock){
currentThreadFNum=currentThreadFNum+1;
System.out.println(list.get((currentListIndex-1)+localThread)+"减一");
allNum=allNum-1;
System.out.println("还剩"+allNum+"");
if(currentThreadFNum==maxSize){
this.lock.notify();//唤醒主线程
}
}
}
}