Java多线程1:Thread Runnable Callable简单使用及常用方法
实现方式
Java线程实现方式
有三种,介绍如下:
- 继承Thread类
可通过继承Thread类来实现,其本质也是实现Runnable接口来实现的。
我们重写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)