java基础:线程的三种创建方式-kb88凯时官网登录

来自:
时间:2024-07-04
阅读:
  1. 定义一个类继承线程类thread
  2. 重写run()方法
  3. 创建线程对象
  4. 调用线程对象的start()方法创建线程

thread类的常用api

  • setname(string name):给线程取名字
  • getname():获取线程的名字
  • public static thread currentthread():获取当前线程对象,这个代码在哪个线程中就获取哪个线程对象
  • public static void sleep(long time):让当前线程休眠多少毫秒再继续执行

优点:

  • 编码简单

缺点:

  • 线程类已经继承thread就无法继承其他类了,功能无法通过继承拓展(单继承的局限性)
  1. 定义一个线程任务类实现runable接口
  2. 重写run()方法
  3. 创建线程任务对象
  4. 把线程任务对象包装成线程对象
  5. 调用线程对象的start()方法启动线程
class myrunable implements runnable{
    @override
    public void run() {
        system.out.println("hello runable");
    }
}
public static void main(string[] args) {
    myrunable target = new myrunable();
    thread t = new thread(target);
    t.start();
}

优点:

  • 避免了java单继承的局限性
  • 同一个任务对象可以被包装成多个线程对象
  • 适合多个线程去共享同一个资源
  • 实现解耦,线程任务代码可以被多个线程共享,线程任务代码和线程独立
  • 线程池只能放入实现runable和callable接口的线程任务,不能直接放入继承thread类的线程对象

缺点

  • 编码复杂(其实还好啦)

匿名内部类的写法:

runnable target = new runnable() {
    @override
    public void run() {
        system.out.println("匿名内部类写法");
    }
};
thread t = new thread(target);
t.start();
//简化
new thread(new runnable() {
    @override
    public void run() {
        system.out.println("匿名内部类写法");
    }
}).start();
//再简化
new thread(() -> system.out.println("匿名内部类写法")).start();
  1. 定义一个线程任务类实现callable接口,申明线程执行的结果类型
  2. 重写线程任务类的call方法,这个方法可以直接返回执行结果
  3. 创建一个callable的线程任务对象
  4. 把线程任务对象包装成一个未来任务对象
  5. 把未来任务对象包装成线程对象
  6. 调用start()方法启动线程
//1.定义一个线程任务类实现callable接口,申明线程执行的结果类型
class mycallable implements callable{
    //2.重写线程任务类的call方法,这个方法可以直接返回执行结果
    @override
    public string call() throws exception {
        system.out.println("hello callable");
        return "success";
    }
}
//3.创建一个callable的线程任务对象
callable call = new mycallable();
//4.把线程任务对象包装成一个未来任务对象
//-- 未来任务对象其实就是一个runable对象,这样就可以被包装成线程对象
//-- 未来任务对象可以在线程执行完毕后得到线程执行结果
futuretask future = new futuretask<>(call);
//5.把未来任务对象包装成线程对象
thread t = new thread(future);
t.start();
//获取线程执行结果,如果线程还没执行完,让出cpu等线程执行完再来去结果
try {
    string res = future.get();
    system.out.println(res);
} catch (interruptedexception e) {
    e.printstacktrace();
} catch (executionexception e) {
    e.printstacktrace();
}

优点:

  • 拥有所有runable的优点
  • 能直接得到线程执行的结果

缺点:

  • 编码复杂
返回顶部
顶部
网站地图