java 多线程
线程的状态
新建(New):当一个线程对象被创建但还没有启动时,它的状态就是新建状态。
运行(Runnable):当线程被启动后,它进入运行状态,开始执行任务。
阻塞(Blocked):当线程在等待某个资源或者锁的时候,它会进入阻塞状态。
等待(Waiting):当线程在等待其他线程的特定操作完成时,它会进入等待状态。
终止(Terminated):当线程的任务执行完毕或者发生异常时,它会进入终止状态。
实现线程的方式
传统实现线程的方式有 继承 Thread 类、实现 Runnable 接口和实现 Callable 接口三种方式。
继承 Thread 类
//继承Thread类,重写run()方法,调用start()方法启动
public class TestThread1 extends Thread{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 1000; i++) {
System.out.print("服了服了"+i + " ");
}
}
public static void main(String[] args) {
//创建线程
TestThread1 t1 = new TestThread1();
//调用start()方法开启
t1.start();
//这个是main线程输出的
for (int i = 0; i < 1000; i++) {
System.out.print("疯了疯了"+i + " ");
}
}
}
实现 Runnable 接口
//实现Runnable接口,重写run()方法,执行线程需要丢入Runnable接口实现类,调用start方法
public class TestThread2 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.print("服了服了+"+i + " ");
}
}
public static void main(String[] args) {
TestThread2 testThread2 = new TestThread2();
new Thread(testThread2).start();
for (int i = 0; i < 1000; i++) {
System.out.print("疯了疯了+"+i +" ");
}
}
}
实现 Callable 接口
//实现Callable接口
public class TestCallable implements Callable<Boolean> {
//重写call()方法
@Override
public Boolean call() throws Exception {
System.out.println("call方法");
return true;
}
public static void main(String[] args) throws Exception {
//创建对象
TestCallable tc = new TestCallable();
//创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(1);
//提交执行
Future<Boolean> result = ser.submit(tc);//通过服务提交线程
//获取结果
boolean b = result.get(); //call()方法返回类型
//关闭服务
ser.shutdown();
}
}
线程常用的方法
- start():启动线程,使其进入就绪状态,并开始执行线程的run()方法。
- run():线程的主体方法,包含线程要执行的任务逻辑。
- sleep():让线程暂时休眠一段时间,单位是毫秒。这个方法可以用来模拟一些延时操作。
- join():让一个线程等待另一个线程执行完毕。可以用来控制线程的执行顺序。
- interrupt():中断线程的执行。会给线程发送一个中断信号,但线程是否真正中断还需要线程自己来判断。
- yield():暂停当前线程的执行,让出CPU的使用权给其他线程。但是是否成功让出由系统决定。
- isAlive():判断线程是否还存活,即线程是否还在执行中。
- getName()和setName():获取和设置线程的名字。
- setPriority():设置线程的优先级,范围从1到10,数字越大优先级越高。
- currentThread():获取当前执行的线程对象。
这些方法可以帮助你更好地控制线程的执行和管理,但要记得合理使用,以避免产生不必要的问题哦!