线程实现的3种方法
终于要写代码了!!!
1.继承Thread覆run()方法
public class ThreadA extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
Thread.sleep(500L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("这是线程A,通过继承Thead实现");
}
public static void main(String[] args) {
ThreadA threadA=new ThreadA();
threadA.start();//启动线程
System.out.println("这是主线程********");
}
}
结果:
这是主线程********
这是线程A,通过继承Thead实现
2.实现runable接口
public class ThreadB implements Runnable {
@Override
public void run() {
try {
//休息几分钟
Thread.sleep(500L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("这是线程B");
}
public static void main(String[] args) {
ThreadB threadB = new ThreadB();
new Thread(threadB).start();
System.out.println("这是主线程");
}
}
结果
这是主线程
这是线程B
3.实现callable接口
public class ThreadC implements Callable<String> {
@Override
public String call() throws Exception {
Thread.sleep(500L);
System.out.println("这线程C");
return "this is ThreadC";
}
public static void main(String[] args) {
ThreadC threadC = new ThreadC();
FutureTask<String> futureTask = new FutureTask<String>(threadC);
new Thread(futureTask).start();// 启动线程
System.out.println("this is main thread:beginning.........");
try {
System.out.println("返回结果:" + futureTask.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("this is main thread:end.........");
}
}
结果
this is main thread:beginning.........
这线程C
返回结果:this is ThreadC
this is main thread:end.........
Thread的基本属性
依然是贴图。。。。
下面我们写几个代码说明一下Thread的几个属性
public class ThreadB implements Runnable {
@Override
public void run() {
Thread curthread = Thread.currentThread();
System.out.println("返回当前线程的名称" + curthread.getName());
System.out.println("返回当前线程" + curthread.getName() + " 线程组活动数:" + Thread.activeCount());
System.out.println("返回当前线程" + curthread.getName() + " 标识符:" + curthread.getId());
System.out.println("返回当前线程" + curthread.getName() + " 优先级:" + curthread.getPriority());
System.out.println("返回当前线程" + curthread.getName() + " 状态:" + curthread.getState());
System.out.println("返回当前线程" + curthread.getName() + " 线程组:" + curthread.getThreadGroup());
System.out.println("返回当前线程" + curthread.getName() + " 是否活跃:" + curthread.isAlive());
System.out.println("返回当前线程" + curthread.getName() + " 是否守护进程:" + curthread.isDaemon());
}
public static void main(String[] args) {
ThreadB threadB = new ThreadB();
for (int i = 0; i < 10; i++) {
new Thread(threadB,"name: ("+i+")").start();
}
Thread mainthread=Thread.currentThread();
System.out.println("返回当前线程的名称" + mainthread.getName());
System.out.println("返回当前线程" + mainthread.getName() + " 线程组活动数:" + Thread.activeCount());
System.out.println("返回当前线程" + mainthread.getName() + " 标识符:" + mainthread.getId());
System.out.println("返回当前线程" + mainthread.getName() + " 优先级:" + mainthread.getPriority());
System.out.println("返回当前线程" + mainthread.getName() + " 状态:" + mainthread.getState());
System.out.println("返回当前线程" + mainthread.getName() + " 线程组:" + mainthread.getThreadGroup());
System.out.println("返回当前线程" + mainthread.getName() + " 是否活跃:" + mainthread.isAlive());
System.out.println("返回当前线程" + mainthread.getName() + " 是否守护进程:" + mainthread.isDaemon());
}
}
结果:
返回当前线程的名称name: (0)
返回当前线程的名称main
返回当前线程main 线程组活动数:11
返回当前线程main 标识符:1
返回当前线程main 优先级:5
返回当前线程的名称name: (2)
返回当前线程name: (2) 线程组活动数:11
返回当前线程name: (2) 标识符:10
返回当前线程name: (2) 优先级:5
返回当前线程的名称name: (1)
返回当前线程name: (1) 线程组活动数:11
返回当前线程name: (1) 标识符:9
返回当前线程name: (1) 优先级:5
返回当前线程name: (0) 线程组活动数:11
返回当前线程name: (0) 标识符:8
返回当前线程name: (0) 优先级:5
返回当前线程的名称name: (3)
返回当前线程name: (3) 线程组活动数:11
返回当前线程name: (3) 标识符:11
返回当前线程name: (3) 优先级:5
返回当前线程的名称name: (4)
返回当前线程name: (4) 线程组活动数:11
返回当前线程name: (4) 标识符:12
返回当前线程name: (4) 优先级:5
返回当前线程的名称name: (5)
返回当前线程name: (5) 线程组活动数:11
返回当前线程name: (5) 标识符:13
返回当前线程name: (5) 优先级:5
返回当前线程的名称name: (7)
返回当前线程name: (7) 线程组活动数:11
返回当前线程name: (7) 标识符:15
返回当前线程name: (7) 优先级:5
返回当前线程的名称name: (8)
返回当前线程name: (8) 线程组活动数:11
返回当前线程name: (8) 标识符:16
返回当前线程name: (8) 优先级:5
返回当前线程的名称name: (6)
返回当前线程的名称name: (9)
返回当前线程name: (9) 线程组活动数:11
返回当前线程name: (9) 标识符:17
返回当前线程name: (9) 优先级:5
返回当前线程name: (6) 线程组活动数:11
返回当前线程name: (6) 标识符:14
返回当前线程name: (6) 优先级:5
返回当前线程main 状态:RUNNABLE
返回当前线程name: (4) 状态:RUNNABLE
返回当前线程main 线程组:java.lang.ThreadGroup[name=main,maxpri=10]
返回当前线程main 是否活跃:true
返回当前线程main 是否守护进程:false
返回当前线程name: (3) 状态:RUNNABLE
返回当前线程name: (3) 线程组:java.lang.ThreadGroup[name=main,maxpri=10]
返回当前线程name: (3) 是否活跃:true
返回当前线程name: (3) 是否守护进程:false
返回当前线程name: (6) 状态:RUNNABLE
返回当前线程name: (6) 线程组:java.lang.ThreadGroup[name=main,maxpri=10]
返回当前线程name: (6) 是否活跃:true
返回当前线程name: (6) 是否守护进程:false
返回当前线程name: (9) 状态:RUNNABLE
返回当前线程name: (9) 线程组:java.lang.ThreadGroup[name=main,maxpri=10]
返回当前线程name: (9) 是否活跃:true
返回当前线程name: (9) 是否守护进程:false
返回当前线程name: (1) 状态:RUNNABLE
返回当前线程name: (1) 线程组:java.lang.ThreadGroup[name=main,maxpri=10]
返回当前线程name: (1) 是否活跃:true
返回当前线程name: (1) 是否守护进程:false
返回当前线程name: (5) 状态:RUNNABLE
返回当前线程name: (5) 线程组:java.lang.ThreadGroup[name=main,maxpri=10]
返回当前线程name: (5) 是否活跃:true
返回当前线程name: (5) 是否守护进程:false
返回当前线程name: (7) 状态:RUNNABLE
返回当前线程name: (7) 线程组:java.lang.ThreadGroup[name=main,maxpri=10]
返回当前线程name: (7) 是否活跃:true
返回当前线程name: (7) 是否守护进程:false
返回当前线程name: (8) 状态:RUNNABLE
返回当前线程name: (8) 线程组:java.lang.ThreadGroup[name=main,maxpri=10]
返回当前线程name: (8) 是否活跃:true
返回当前线程name: (8) 是否守护进程:false
返回当前线程name: (2) 状态:RUNNABLE
返回当前线程name: (2) 线程组:java.lang.ThreadGroup[name=main,maxpri=10]
返回当前线程name: (2) 是否活跃:true
返回当前线程name: (2) 是否守护进程:false
返回当前线程name: (0) 状态:RUNNABLE
返回当前线程name: (0) 线程组:java.lang.ThreadGroup[name=main,maxpri=10]
返回当前线程name: (0) 是否活跃:true
返回当前线程name: (0) 是否守护进程:false
返回当前线程name: (4) 线程组:java.lang.ThreadGroup[name=main,maxpri=10]
返回当前线程name: (4) 是否活跃:true
返回当前线程name: (4) 是否守护进程:false
由于篇幅的限制,这里就介绍Thread的实现方法和几个属性,就当是多线程的入门吧!!下面的文章就深入的理解线程的中断和生命周期,守护线程和线程组。