Java多线程1:Thread Runnable Callable简单使用及常用方法

实现方式

Java线程实现方式
有三种,介绍如下:

  • 继承Thread类
    可通过继承Thread类来实现,其本质也是实现Runnable接口来实现的。
    image.png

我们重写run方法即可,子类对象可直接调用父类start()方法启动,由于类只能继承一个类,所以此方法不推荐,示例如下:

public class ThreadTest extends Thread{
	private String name;
	public ThreadTest(String name) {
		this.name=name;
	}
	public void run() {
		Thread.currentThread().setName(name);
		for (int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName()+" "+i);
		}	
	}
	
	public static void main(String[] args) {
		new ThreadTest("线程1").start();
		new ThreadTest("线程2").start();
	}
}
  • 实现Runnable接口
    线程可通过实现Runnable接口的run()方法来实现,使用方式和启动方式如下示例:
public class RunnableTest implements Runnable{
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println(Thread.currentThread().getName()+" "+i);
		}	
	}
	public static void main(String[] args) {
		RunnableTest runnableTest =new RunnableTest();
		new Thread(runnableTest,"线程1").start();
		new Thread(runnableTest,"线程2").start();
	}
}
  • 实现Callable接口
    实现Callable接口的Call()方法,其与Runnable不同在于其需要返回值,可抛出异常,启动方式上也存在不同。
public class CallableTest implements Callable<Boolean> {
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		CallableTest  callableTest=new CallableTest();
		FutureTask<Boolean> futureTask = new FutureTask<>(callableTest);
		FutureTask<Boolean> futureTask2 = new FutureTask<>(callableTest);
		new Thread(futureTask,"线程1").start();;
		new Thread(futureTask2,"线程2").start();
	}
	public Boolean call() throws Exception {
		for (int i = 0; i < 100; i++) {
			System.out.println(Thread.currentThread().getName()+" "+i);
		}
		return true;
	}
}

常用方法

  • 线程休眠
Thread.sleep(i);//i单位为毫秒
  • 线程礼让
    让线程暂停(不是阻塞),转为就绪状态,cpu重新进行调度。礼让不一定成功,有可能重新调度仍为该线程占用cpu。
Thread.yield();
  • 强制执行
    需要注意的是线程强制执行指的是将该线程进入运行状态,已经开始运行的其他线程并不会被阻塞,该方法真正阻塞的是main线程,使main线程进入等待序列,待该线程运行结束后才会执行main线程。
t1.join()//t1为线程实现类创建出的对象,在线程启动后可进行该方法
  • 获得线程状态
    线程状态有6种,未启动、执行、阻塞、等待、退出、等待另一个线程执行达到等待时间的线程。
t1.getState()
  • 守护线程
    会使该线程进入后台运行,即使此时程序已经运行完毕,守护线程可能还在执行。
t1.setgDaemon(true)