public class Test {
public static void main(String[] args) {
int count = 1000
ExecutorService executorService = Executors.newFixedThreadPool(count)
for (int i = 0 i < count i++)
executorService.execute(new Test().new Task())
executorService.shutdown()
while (!executorService.isTerminated()) {
try {
Thread.sleep(10)
} catch (InterruptedException e) {
e.printStackTrace()
}
}
}
public class Task implements Runnable {
@Override
public void run() {
try {
// 测试内容
} catch (Exception e) {
e.printStackTrace()
}
}
}
}
如果要实现真正的并发同时执行,可通过CyclicBarrier来控制。
public class Test {
public static void main(String[] args) {
int count = 1000
CyclicBarrier cyclicBarrier = new CyclicBarrier(count)
ExecutorService executorService = Executors.newFixedThreadPool(count)
for (int i = 0 i < count i++)
executorService.execute(new Test().new Task(cyclicBarrier))
executorService.shutdown()
while (!executorService.isTerminated()) {
try {
Thread.sleep(10)
} catch (InterruptedException e) {
e.printStackTrace()
}
}
}
public class Task implements Runnable {
private CyclicBarrier cyclicBarrier
public Task(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier
}
@Override
public void run() {
try {
// 等待所有任务准备就绪
cyclicBarrier.await()
// 测试内容
} catch (Exception e) {
e.printStackTrace()
}
}
}
}
在java中如果要创建线程的话,一般有两种方式:1)继承Thread类;2)实现Runnable接口。1.继承Thread类
继承Thread类的话,必须重写run方法,在run方法中定义需要执行的任务。
123456789101112
class MyThread extends Thread{private static int num = 0public MyThread(){num++ } @Overridepublic void run() {System.out.println("主动创建的第"+num+"个线程") }}
创建好了自己的线程类之后,就可以创建线程对象了,然后通过start()方法去启动线程。注意,不是调用run()方法启动线程,run方法中只是定义需要执行的任务,如果调用run方法,即相当于在主线程中执行run方法,跟普通的方法调用没有任何区别,此时并不会创建一个新的线程来执行定义的任务。
1234567891011121314151617181920
public class Test {public static void main(String[] args) {MyThread thread = new MyThread() thread.start() }} class MyThread extends Thread{private static int num = 0public MyThread(){num++ } @Overridepublic void run() {System.out.println("主动创建的第"+num+"个线程") }}
在上面代码中,通过调用start()方法,就会创建一个新的线程了。为了分清start()方法调用和run()方法调用的区别,请看下面一个例子:
1234567891011121314151617181920212223
public class Test {public static void main(String[] args) {System.out.println("主线程ID:"+Thread.currentThread().getId()) MyThread thread1 = new MyThread("thread1") thread1.start() MyThread thread2 = new MyThread("thread2") thread2.run() }} class MyThread extends Thread{private String namepublic MyThread(String name){this.name = name } @Overridepublic void run() {System.out.println("name:"+name+" 子线程ID:"+Thread.currentThread().getId()) }