三种线程的创建方式学习
线程名称设置,创建
- 方法1;通过继承Thread创建线程
package com.Thread;
public class ThreadDemo01 {
public static void main(String[] args) {
Thread.currentThread().setName("修主线程");
//对子线程进行启动
TreadDemo02 thread = new TreadDemo02("构造器传字符串参修改线程名字");//这里不能用子类进行调用方法,调用的话就当作普通方法执行了
thread.start();
//main的主线程
for(int i =1;i<=10;i++)
{
System.out.println(Thread.currentThread().getName()+i);
}
}
}
//开辟子线程工作区域
class TreadDemo02 extends Thread {
public TreadDemo02(String name){
super(name);
}
public void run() {
for(int i =1;i<=10;i++){
System.out.println(this.getName()+i);
}
}
}
-
方法2,通过实现接口Runnable来创建线程
(Runnable接口在Thread类中实现;由于一个类只能有一个父类;java的单继承;多实现特点;选择用接口Runnable;更加灵活;高效)
package com.Thread; //线程体 public class Demo003 implements Runnable{ int ticketnum = 10; public void run() { //有100人在抢票 for(int i = 1;i<=100;i++){ if(ticketnum>0){ System.out.println("我抢到了火车票;第"+ticketnum--+"张;从"+Thread.currentThread().getName()+"窗口"); } } } }package com.Thread; public class Demo002 { public static void main(String[] args) { Demo003 demo003 = new Demo003(); //Runnable方法调用线程;共享资源的能力也会强一些,不需要非得加个static来修饰 //这里的名字需要从获取主线程进行获取Thread.currentThread().getName();默认为main //操控体 Thread t1 = new Thread(demo003,"1号"); t1.start(); Thread t2 = new Thread(demo003,"2号"); t2.start(); Thread t3 = new Thread(demo003,"3号"); t3.start(); } }- 方法3,Callable接口实现了线程体可以有返回值;可以有异常的述求;弥补了上述的不但是在实现线程启动时必须调用futureTask作为中间键进行嵌套本身类对象demo004和thread的连接启动
package com.Thread;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class Demo004 implements Callable {
@Override
public Object call() throws Exception {
Random random = new Random();
int i = random.nextInt(5);
return i;
}
}
class Demo005{
public static void main(String[] args) throws Exception {
Demo004 demo004 = new Demo004();
FutureTask futureTask = new FutureTask(demo004);
Thread thread = new Thread(futureTask);
thread.start();
//这里通过futureTask调用返回值进行接收
Object o = futureTask.get();
System.out.println(o);
}
}

浙公网安备 33010602011771号