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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。