1,继承自Thread类,代码逻辑写在子线程中,需要重写run()方法,主线程里start()就可以了
package com.myjava.thread;
public class ExtendsThread extends Thread{
private final static int THREAD_NUM = 5;
public static void main(String[] args){
for (int i = 0; i <THREAD_NUM; i++) {
new ExtendsThread("thread"+i).start();
}
}
public ExtendsThread(String name){
super(name);
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < this.THREAD_NUM; i++) {
System.out.println(this.getName()+i);
}
}
}
运行结果:
thread00
thread01
thread02
thread03
thread04
thread20
thread21
thread22
thread23
thread24
thread40
thread41
thread42
thread43
thread44
thread10
thread11
thread12
thread13
thread14
thread30
thread31
thread32
thread33
thread34
2,实现Runnable接口
package com.myjava.thread;
public class ImplRunnable implements Runnable {
private static final int THREAD_NUM = 5;
@Override
public void run() {
for (int i = 0; i < THREAD_NUM; i++) {
System.out.println(Thread.currentThread().getName()+i);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int j = 0; j < THREAD_NUM; j++) {
ImplRunnable implRunnable= new ImplRunnable();
new Thread(implRunnable,"thread"+j).start();
}
}
}
运行结果
thread10
thread11
thread12
thread13
thread14
thread30
thread31
thread32
thread33
thread34
thread00
thread01
thread02
thread03
thread04
thread20
thread21
thread22
thread23
thread24
thread40
thread41
thread42
thread43
thread44
3,通过线程池
package com.myjava.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPool {
private static int POOL_NUM = 10;
public static void main(String[] agrs){
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < POOL_NUM; i++) {
RunnableThread thread = new RunnableThread();
executorService.execute(thread);
}
}
}
class RunnableThread implements Runnable{
private int THREAD_NUM = 10;
public void run() {
for (int i = 0; i <THREAD_NUM; i++) {
System.out.println("线程"+Thread.currentThread()+i);
}
}
}
-----
线程Thread[pool-1-thread-2,5,main]0
线程Thread[pool-1-thread-2,5,main]1
线程Thread[pool-1-thread-2,5,main]2
线程Thread[pool-1-thread-2,5,main]3
线程Thread[pool-1-thread-2,5,main]4
线程Thread[pool-1-thread-2,5,main]5
线程Thread[pool-1-thread-2,5,main]6
线程Thread[pool-1-thread-2,5,main]7
线程Thread[pool-1-thread-2,5,main]8
线程Thread[pool-1-thread-2,5,main]9
线程Thread[pool-1-thread-4,5,main]0
线程Thread[pool-1-thread-4,5,main]1
线程Thread[pool-1-thread-4,5,main]2
线程Thread[pool-1-thread-4,5,main]3
线程Thread[pool-1-thread-4,5,main]4
线程Thread[pool-1-thread-4,5,main]5
线程Thread[pool-1-thread-4,5,main]6
线程Thread[pool-1-thread-4,5,main]7
线程Thread[pool-1-thread-4,5,main]8
线程Thread[pool-1-thread-4,5,main]9
线程Thread[pool-1-thread-4,5,main]0
线程Thread[pool-1-thread-4,5,main]1
线程Thread[pool-1-thread-4,5,main]2
线程Thread[pool-1-thread-4,5,main]3
线程Thread[pool-1-thread-4,5,main]4
线程Thread[pool-1-thread-4,5,main]5
线程Thread[pool-1-thread-4,5,main]6
线程Thread[pool-1-thread-4,5,main]7
线程Thread[pool-1-thread-4,5,main]8
线程Thread[pool-1-thread-4,5,main]9
线程Thread[pool-1-thread-1,5,main]0
线程Thread[pool-1-thread-1,5,main]1
线程Thread[pool-1-thread-1,5,main]2
线程Thread[pool-1-thread-1,5,main]3
线程Thread[pool-1-thread-1,5,main]4
线程Thread[pool-1-thread-1,5,main]5
线程Thread[pool-1-thread-1,5,main]6
线程Thread[pool-1-thread-1,5,main]7
线程Thread[pool-1-thread-1,5,main]8
线程Thread[pool-1-thread-1,5,main]9
线程Thread[pool-1-thread-5,5,main]0
线程Thread[pool-1-thread-5,5,main]1
线程Thread[pool-1-thread-5,5,main]2
线程Thread[pool-1-thread-5,5,main]3
线程Thread[pool-1-thread-5,5,main]4
线程Thread[pool-1-thread-5,5,main]5
线程Thread[pool-1-thread-5,5,main]6
线程Thread[pool-1-thread-5,5,main]7
线程Thread[pool-1-thread-5,5,main]8
线程Thread[pool-1-thread-5,5,main]9
线程Thread[pool-1-thread-3,5,main]0
线程Thread[pool-1-thread-3,5,main]1
线程Thread[pool-1-thread-3,5,main]2
线程Thread[pool-1-thread-3,5,main]3
线程Thread[pool-1-thread-3,5,main]4
线程Thread[pool-1-thread-3,5,main]5
线程Thread[pool-1-thread-3,5,main]6
线程Thread[pool-1-thread-3,5,main]7
线程Thread[pool-1-thread-3,5,main]8
线程Thread[pool-1-thread-3,5,main]9
线程Thread[pool-1-thread-2,5,main]0
线程Thread[pool-1-thread-2,5,main]1
线程Thread[pool-1-thread-2,5,main]2
线程Thread[pool-1-thread-2,5,main]3
线程Thread[pool-1-thread-2,5,main]4
线程Thread[pool-1-thread-2,5,main]5
线程Thread[pool-1-thread-2,5,main]6
线程Thread[pool-1-thread-2,5,main]7
线程Thread[pool-1-thread-2,5,main]8
线程Thread[pool-1-thread-2,5,main]9
线程Thread[pool-1-thread-2,5,main]0
线程Thread[pool-1-thread-2,5,main]1
线程Thread[pool-1-thread-2,5,main]2
线程Thread[pool-1-thread-2,5,main]3
线程Thread[pool-1-thread-2,5,main]4
线程Thread[pool-1-thread-2,5,main]5
线程Thread[pool-1-thread-2,5,main]6
线程Thread[pool-1-thread-2,5,main]7
线程Thread[pool-1-thread-2,5,main]8
线程Thread[pool-1-thread-2,5,main]9
线程Thread[pool-1-thread-2,5,main]0
线程Thread[pool-1-thread-2,5,main]1
线程Thread[pool-1-thread-2,5,main]2
线程Thread[pool-1-thread-2,5,main]3
线程Thread[pool-1-thread-2,5,main]4
线程Thread[pool-1-thread-2,5,main]5
线程Thread[pool-1-thread-2,5,main]6
线程Thread[pool-1-thread-2,5,main]7
线程Thread[pool-1-thread-2,5,main]8
线程Thread[pool-1-thread-2,5,main]9
线程Thread[pool-1-thread-2,5,main]0
线程Thread[pool-1-thread-2,5,main]1
线程Thread[pool-1-thread-2,5,main]2
线程Thread[pool-1-thread-2,5,main]3
线程Thread[pool-1-thread-2,5,main]4
线程Thread[pool-1-thread-2,5,main]5
线程Thread[pool-1-thread-2,5,main]6
线程Thread[pool-1-thread-2,5,main]7
线程Thread[pool-1-thread-2,5,main]8
线程Thread[pool-1-thread-2,5,main]9
二、创建线程的三种方式的对比
采用实现Runnable、Callable接口的方式创见多线程时,优势是:
线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。
在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
劣势是:
编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。
使用继承Thread类的方式创建多线程时优势是:
编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。
劣势是:
线程类已经继承了Thread类,所以不能再继承其他父类。