第一种方法:
package duoXianChengs;
import java.util.concurrent.CountDownLatch;
public class duoXianCheng extends Thread {
private String gg;
duoXianCheng(String kk){
gg = kk;
}
static CountDownLatch cdl;//开启线程的数目
public int count = 0;
@Override
public void run() {
for(int i=0;i<=100000;i++){
System.out.println(gg);
}
try {
duoXianCheng.inc();//线程任务执行完成,对线程的数目减1
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
}
public synchronized static void inc() throws InterruptedException{//注意,如果不加上synchronized,由于并发写入,结果会小于1000
Thread.sleep(1);
//count++;
cdl.countDown();
}
public static void main(String[] args) {
cdl=new CountDownLatch(5);//这里的数字,开启几个线程就写几(这里的数字要与开启线程的数目一致)
for(int i=0;i<5;i++){
Thread myThread1 = new duoXianCheng(String.valueOf(i)); // 创建一个新的线程 myThread1 此线程进入新建状态
myThread1.start();
}
try {
cdl.await();//主线程等待子线程执行输出
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("nimenhao");
}
}
第二种方法:
package duoXianChengs;
import java.util.concurrent.CountDownLatch;
public class duoXianCheng1 implements Runnable {
private String gg;
duoXianCheng1(String kk){
gg = kk;
}
static CountDownLatch cdl;//开启线程的数目
public int count = 0;
@Override
public void run() {
for(int i=0;i<=100000;i++){
System.out.println(gg);
}
try {
duoXianCheng1.inc();//线程任务执行完成,对线程的数目减1
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
}
public synchronized static void inc() throws InterruptedException{//注意,如果不加上synchronized,由于并发写入,结果会小于1000
Thread.sleep(1);
//count++;
cdl.countDown();
}
public static void main(String[] args) {
cdl=new CountDownLatch(5);//这里的数字,开启几个线程就写几
for(int i=0;i<5;i++){
//Thread myThread1 = new duoXianCheng1(String.valueOf(i)); // 创建一个新的线程 myThread1 此线程进入新建状态
new Thread(new duoXianCheng1(String.valueOf(i))).start();;
//myThread1.start();
}
try {
cdl.await();//主线程等待子线程执行输出
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("nimenhao");
}
}