Java中线程的三种创建方式和简单使用

创建方法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虚拟机也就结束。
  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值