Java多线程总结,java创建多线程的两种方式

  Java多线程总结,java创建多线程的两种方式

  本文给大家带来一些java的知识,包括创建多线程的五种方法,包括继承Thread类,实现Runnable接口,实现Callable接口,继承TimerTask类,通过线程池启动多线程。希望对你有帮助。

  如何解决写爬虫IP受阻的问题?立即使用。

  

Java创建多线程的五种方法

  只针对Java编程的交流和学习。如有疑问,欢迎随时评论。欢迎补充交流,转载请注明!

(一)继承Thread类

  

1实现描述

  通过继承Thread并重写其run(),在run方法中定义要执行的任务。创建的子类可以通过调用start()方法来执行thread方法。通过继承thread实现的Thread类,多个线程不能共享Thread类的实例变量。你需要创建不同的线程对象,所以自然不会共享资源。

2具体步骤

   1)定义UserThread类并继承Thread类。

  2)覆盖run()方法

  3)创建一个用户线程对象

  4)调用start()方法

  

3代码实现

  

4注意事项

  数据资源不共享,多个线程分别完成自己的任务。比如三个售票窗口同时售票,各自卖自己的票,就会出现三个售票窗口卖同一张票的问题。

(二)实现Runnable接口

  

1实现描述

  你需要定义一个类来实现Runnable接口,并覆盖接口的run()方法,这是线程执行器。然后创建Runnable实现类的对象作为线程对象的参数目标,这是真正的线程对象。线程间的资源共享可以通过用实现Runnable接口的线程类创建对象来实现。

2具体步骤

   1)定义一个UserRun类并实现Runnble接口。

  2)覆盖run()方法

  3)创建一个用户运行类的对象

  4)创建Thread类的对象,UserRun类的对象作为Thread类构造方法的参数。

  5)启动线程。

  

3代码实现

  

4注意事项

  数据资源共享,多个线程共同完成一项任务(多个线程共享创建线程对象的资源)。比如三个售票窗口(三个线程)同时售票(MyThread类中的ticket),三个线程共享资源。

(三)实现Callable接口

  

1实现描述

  可调用接口就像是可运行接口的升级版。它提供的call()方法将作为线程的执行体,同时允许返回值。Callable对象不能直接作为Thread对象的目标,因为Callable接口是Java5中的新接口,不是Runnable接口的子接口。为了解决这个问题,引入了Future接口,它可以接受call()的返回值。RunnableFuture接口是Future接口和Runnable接口的子接口,可以作为线程对象的目标。

2具体步骤

   1)定义UserCallable类,实现Callable接口。

  2)重写call()方法

  3)创建一个UserCallable对象

  4)创建RunnableFuture接口的子类FutureTask的对象,构造函数的参数是UserCallable的对象。

  5)创建一个线程类的对象,构造函数的参数是FutureTask的对象。

  6)启动线程。

  

3代码实现

  

4注意事项

  数据资源共享,多个线程共同完成一项任务(多个线程共享创建线程对象的资源)。比如三个售票窗口(三个线程)同时售票(MyThread类中的ticket),三个线程共享资源。同时线程调用后会添加返回值

(四)继承TimerTask类

  

1实现描述

   Timer和TimerTask可用作实现线程的另一种方式。Timer是一个线程工具,用于调度稍后在后台线程中执行的任务。您可以安排任务执行一次,或者定期重复执行。可以看作是一个定时器,可以调度TimerTask。TimerTask是一个实现Runnable接口的抽象类,所以它具有多线程的能力。

2具体步骤

   1)定义类UserTimerTask并继承抽象类TimerTask。

  2)创建一个用户任务类的对象

  3)创建一个Timer类的对象,设置任务的执行策略。

  

3代码实现

  

4注意事项

   Timer类创建的线程大多用于处理定时任务,线程之间不共享数据资源,所以多个线程各自完成自己的任务。

(五)通过线程池启动多线程

  

1实现描述

  线程池可以通过执行器的工具类创建。提高系统的响应速度。当一个任务到达时,它可以立即执行,而不需要等待通过重用现有线程来创建新线程。减少对系统资源的消耗,通过重用现有线程,减少线程创建和销毁带来的消耗。控制并发线程的数量很方便。因为如果无限制的创建线程,可能会导致内存占用过多和OOM,目的可能会导致CPU切换过多。

2实现方法

  

1) FixThreadPool(int n)固定大小的线程池

  

(1)具体步骤

   通过Executors.newFixedThreadPool(5)创建一个固定大小的线程池

  重写Runnable类的run()方法,使用线程池执行任务。

   Shutdown()关闭线程池。

  

(2)代码实现

  

(3)注意事项

  创建一个固定大小的线程池,可以实现数据资源共享,多个线程可以共同完成一个任务。

2)SingleThreadExecutor( )单线程池

  

(1)具体步骤

   通过executors . newsingleheadexecutor()创建单线程池

  重写Runnable类的run()方法,使用线程池执行任务。

   Shutdown()关闭线程池。

  

(2)代码实现

  

(3)注意事项

  线程池仅创建一个线程来执行任务。

3)CachedThreadPool( )缓存线程池

  

(1)具体步骤

   通过Executors.newCachedThreadPool()创建尽可能多的线程池

  重写Runnable类的run()方法,使用线程池执行任务。

   Shutdown()关闭线程池。

  

(2)代码实现

  

(3)注意事项

  此方法将创建尽可能多的线程来完成任务。例如,虽然只有10张票,但线程池至少生成12个线程。

4)ScheduledThreadPool(int n)定时周期性线程池

  

(1)具体步骤

   通过executors . newscheduledthreadpool(5)创建一个线程池,线程池有固定数量的核心线程(需要维护的最小线程数,线程创建后不会被回收),线程会按计划定期执行。

  重写Runnable类的run()方法,使用线程池执行任务。

   Shutdown()关闭线程池。

  

(2)代码实现

  

(3)注意事项

  创建周期性线程池,支持任务的调度和周期性执行(第一个时间参数是执行延迟时间,第二个参数是执行间隔时间)。

5)WorkStealingPool( )新线程池类ForkJoinPool的扩展

  

(1)具体步骤

   通过Executors.newWorkStealingPool()创建一个线程池

  重写Runnable类的run()方法,通过Thread类的对象调用Runnable类的对象,使用线程池执行任务。

   Sleep()让主线程等待子线程完成执行,也可以使用计数器。

   Shutdown()关闭线程池。

  

(2)代码实现

  

(3)注意事项

  因为每个线程都有自己的任务队列,因为任务多了或少了,可能会造成CPU负载不均衡。该方法可以有效利用多核CPU优势,任务少的线程可以“偷取”任务多的线程的任务,从而平衡各个CPU任务的执行情况。推荐:《java教程》以上是五种方法!关于创建Java多线程摘要的详细信息,请关注我们的其他相关文章了解更多!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: