java.lang.Thread线程类和接口java.lang.Runnable,实现Runnable接口时线程执行类,需要实现run方法。
实现Runnable接口
实现Runnable接口是线程执行类,需要实现run方法,子线程处理代码放到run方法中,run方法称为线程体。
Thread类相关构造方法:
Thread(Runnable target,String name):target是线程执行对象,实现Runnble接口。name为线程指定一个名称
Thread(Runnable target):target是线程执行对象,实现Runnble接口。线程名称是JVM分配的
继承Thread线程类
事实上Thread类也是吸纳了Runnable接口,所以Thread类也可以作为线程执行对象,这需要继承Thread类,覆盖run()方法。
Thread类相关构造方法:
Thread(String name):name为线程指定一个名称。
Thread():线程名称是JVM分配的。
代码案例
创建子线程
//线程执行对象(子线程)
public class Runner implements Runnable {
//编写执行线程代码
@Override
public void run() {
//子线程(线程体)
for(int i=0;i<10;i++) {
//打印次数和线程的名字
System.out.printf("第%d次执行-%s\n",i,Thread.currentThread().getName());
try {
//随机生成休眠时间,这里指的毫毛
long sleepTime=(long)(1000*Math.random());
//这里可以指定纳秒
//Thread.sleep(sleepTime,(int) (10000*Math.random()));
//线程休眠(这里的休眠是为了方便下一个线程的去运行)
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
// TODO: handle exception
}
}
//线程执行结束
System.out.println("执行完成!"+Thread.currentThread().getName());
}
}
主线程
public class HelloWorld {
//主线程
public static void main(String[] args) {
//子线程
//创建线程t1,参数是一个线程执行对象Runner
//实例化new Runner()
Thread t1=new Thread(new Runner());
//开始线程t1
t1.start();
//子线程
//创建线程t2,参数是一个线程执行对象Runner
Thread t2=new Thread(new Runner(),"MyThread");
//开始线程t2
t2.start();
}
}
可以看到两个线程交叉执行
第0次执行-Thread-0
第0次执行-MyThread
第1次执行-Thread-0
第1次执行-MyThread
第2次执行-MyThread
第2次执行-Thread-0
第3次执行-MyThread
第3次执行-Thread-0
第4次执行-Thread-0
第4次执行-MyThread
第5次执行-Thread-0
第5次执行-MyThread
第6次执行-MyThread
第6次执行-Thread-0
第7次执行-Thread-0
第7次执行-MyThread
第8次执行-Thread-0
第9次执行-Thread-0
第8次执行-MyThread
第9次执行-MyThread
执行完成!Thread-0
执行完成!MyThread