1.继承Thread类继承Thread类并覆盖run()方法。在主线程中创建一个MyThread类对象,调用start()方法启动线程。publicclassThreadDemo{publicstaticvoidmain(String[]args){MyThreadmyThread=newMyThread();我的线程.start();}staticclassMyThreadextendsThread{@Overridepublicvoidrun(){System.out.println("继承线程创建线程");}}2。实现Runnable接口创建一个MyRunnable内部类实现Runnable接口,重写run()方法。创建Thread类对象时传入MyRunnable类对象。也可以直接使用Lambda表达式,不用单独写Runnable接口的实现类。publicclassThreadDemo{publicstaticvoidmain(String[]args){//实现Runnable接口Threadt1=newThread(newMyRunnable());t1.开始();//直接使用Lambda缩写newThread(()->{System.out.println("CreatethreadwithLambdaabbreviation");}).start();}staticclassMyRunnableimplementsRunnable{@Overridepublicvoidrun(){System.out.println("实现Runnable接口创建线程");}}}3.实现Callable接口创建一个MyCallable内部类来实现Callable接口,重写call()方法。FutureTask实现了RunnableFuture,它继承了Runnable、Future。意思是可以通过FutureTask接收到Callable中调用方法的返回值。和Runnable一样,传入Thread创建线程。futureTask.get()方法可以拿到线程返回的结果,但是这个方法是阻塞的。意思是如果t1线程一直在计算,主线程需要等t1结束拿到结果再继续运行。公共类ThreadDemo{publicstaticvoidmain(String[]args)throwsExecutionException,InterruptedException{FutureTaskfutureTask=newFutureTask<>(newMyCallable());线程t1=新线程(futureTask);t1.开始();//如果futureTask.get()没有得到结果,代码将等待System.out.println(futureTask.get());System.out.println("t1线程执行完成");}staticclassMyCallableimplementsCallable{@OverridepublicObjectcall(){System.out.println("实现Callable接口创建线程");return"可调用返回结果";}}}4、使用线程池创建的优点:减少资源消耗。通过重用已创建的线程来降低线程创建和销毁的成本。提高响应能力。当任务到达时,可以立即执行任务,而无需等待线程创建。提高线程可管理性。如果无限创建线程,不仅会消耗系统资源,还会降低系统的稳定性。线程池可用于统一分配、调优和监控。publicclassThreadDemo{publicstaticvoidmain(String[]args){//创建一个有5个固定线程的线程池ExecutorServiceexecutorService=Executors.newFixedThreadPool(5);//使用线程池执行100个任务for(inti=0;i<100;i++){executorService.execute(newRunnable(){@Overridepublicvoidrun(){System.out.println(Thread.currentThread().getName());}});}}}
