创建方法1:
自定义类继承Thread类并重写run()方法,然后创建该类的对象后调用start()方法;
public class TestSubThreadRun extends Thread {
@Override
public void run(){
System.out.println("我就是重写后的run()方法");
}
public static void main(String[] args) {
//父类类型的引用指向子类类型的对象形成多态
Thread t1 = new TestSubThreadRun();
//调用子类重写后的run方法,以后把想让进程做的事就写到重写的run方法中
t1.run();
}
}
创建方法2:
自定义类实现Runnable接口并重写run()方法,然后创建该类的对象作为实参去创建Thread类的对象,最后使用Thread类对象调用start()方法。
public class TestSubRunnableStart implements Runnable {
/*private String name;
public TestSubRunnableStart(String name) {
this.name = name;
}*/
@Override
public void run() {
for(int i = 0; i < 10; i++){
System.out.println("这是run方法中的第" + i + "次输出");
}
}
public static void main(String[] args) {
//创建该类的的引用指向该类的对象,当作参数。
TestSubRunnableStart tsrs = new TestSubRunnableStart();
//使用Thread的有参构造,将tsrs作为参数
Thread t1 = new Thread(tsrs);
t1.start();
for(int i = 0; i < 10; i++){
System.out.println("这是main方法中的第" + i + "次输出");
}
}
}
创建方法3:
实现Callable接口,重写call方法
call方法和run方法的比较:
1.call有返回值,run没有返回值
2.call声明了异常(Exception),run方法中没有声明异常
需求:创建一个线程,该线程会产生一个随机数(10以内的整数),获取产生的随机数
FutureTask,类的描述:
public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V>
作用:
1.将Callable对象转换为Runnable对象,作为参数传递给Thread创建线程使用
2.对线程的执行干预,可以通过get方法获取call方法的返回值
public class TestThreadCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
return new Random().nextInt(10);
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
//创建Callable对象
Callable<Integer> callable = new TestThreadCallable();
//创建FutureTask,将Callbale --> Runnable
FutureTask<Integer> ft = new FutureTask<Integer>(callable);
//创建线程
Thread t = new Thread(ft);
//启动线程
t.start();
System.out.println("线程是否结束:" + ft.isDone());
//获取线程的返回结束
Integer num = ft.get();
System.out.println(num);
System.out.println("线程是否结束:" + ft.isDone());
}
}
常用方法:
static void sleep(long millis) - 用于让当前正在执行的线程休眠参数指定的毫秒数。
- 1秒 = 1000毫秒 1毫秒 = 1000微秒 1微秒 = 1000纳秒
int getPriority() - 用于获取调用对象所代表线程的优先级。
void setPriority(int newPriority) - 用于更改线程的优先级为参数指定的数值。
- 优先级越高的线程表示获取时间片的机会越多,但不保证一定先执行。
void join() - 用于使得当前正在执行的线程等待调用对象所代表的线程终止。
void join(long millis) - 等待调用对象所代表线程的时间最长为参数指定的毫秒数。
boolean isDaemon() - 用于测试调用对象是否为守护线程。
void setDaemon(boolean on) - 用于将调用对象设置为守护线程。
- 该方法必须在调用start()方法前使用。
- 当所有非守护线程结束后,则守护线程随之结束,Java虚拟机也就结束。