在Java开发中,经常会用到多线程开发,比如高并发,文件读写等操作,都可以使用多线程,本文就简单梳理Java中线程的使用
一、线程的创建
在Java中创建线程有三种方式,代码如下:
- 继承Thread类
public class MyThread extends Thread{
@Override
public void run() {
super.run();
System.out.println("线程执行了");
}
}
//使用:
MyThread myThread = new MyThread();
myThread.start();
//输出:
线程执行了
- 实现Runnable接口:
public class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("线程执行了Runnable");
}
}
//使用:
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
//输出:
线程执行了Runnable
- 实现Callable接口
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("MyCallable执行了");
return 123;
}
}
//使用:
MyCallable myCallable = new MyCallable();
FutureTask<Integer> task = new FutureTask<>(myCallable);
new Thread(task).start();
Integer integer = task.get();
System.out.println("返回值:"+integer);
//输出:
MyCallable执行了
返回值:123
Callable相比于Runnable来说功能更加强大,它可以通过FutureTask获取线程的返回值。且可以通过FutureTask接口来进行取消,查询是否完成等操作。
二、 线程的状态
新建(NEW):新建状态,尚未启动的线程。
可运行(RUNNABLE):线程准备就绪,可运行状态。
阻塞(BLOCKED):阻塞状态。例如同步代码块。
等待(WAITING):处于等待状态的线程。
等待(TIMED_WAITING):具有指定等待时间的等待线程的线程状态。
结束(TERMINATED):线程完成执行。结束。
三、线程的优先级
Java中每一个线程都有有个优先级,默认的优先级为5,优先级的范围为1-10,线程优先级有助于系统确定线程的调度顺序,但是不一定优先级越高的线程就越先执行,通常与所依赖的平台相关。
四、线程的常用方法
//开始线程
public synchronized void start()
//开始线程(该线程是使用独立的 Runnable 运行对象构造)
public void run()
//设置线程名称
public final synchronized void setName(String name)
//设置线程优先级
public final void setPriority(int newPriority)
//设置线程守护
public final void setDaemon(boolean on)
//使当前线程等待
public final void wait()
//中断线程
public void interrupt()
//让出资源
Thread.yield();
//线程休眠
Thread.sleep();
五、多线程
上面介绍了创建线程的三种方式,当遇到需要并发场景或者读写文件等操作时,我们可以使用多线程来执行,有利于提高程序的效率,但是如果线程利用不当,创建了太多的线程,反而会导致效率降低。当需要频繁创建线程时,我们就可以使用线程池。