java多线程有几种实现方法?java中实现多线程一般使用两种方法
大家好,如果您还对java多线程有几种实现方法不太了解,没有关系,今天就由本站为大家分享java多线程有几种实现方法的知识,包括java中实现多线程一般使用两种方法的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
Java 实现多线程的几种方式汇总
有三种:
(1)继承Thread类,重写run函数
创建:
class xx extends Thread{
public void run(){
Thread.sleep(1000)//线程休眠1000毫秒,sleep使线程进入Block状态,并释放资源
}}
开启线程:
对象.start()//启动线程,run函数运行
(2)实现Runnable接口,重写run函数
开启线程:
Thread t= new Thread(对象)//创建线程对象
t.start()
(3)实现Callable接口,重写call函数
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
Callable和Runnable有几点不同:
①Callable规定的方法是call(),而Runnable规定的方法是run().
②Callable的任务执行后可返回值,而Runnable的任务是不能返回值的
③call()方法可抛出异常,而run()方法是不能抛出异常的。
④运行Callable任务可拿到一个Future对象,Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等
待计算的完成,并检索计算的结果.通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果
多线程实现的四种方式
多线程实现的四种方式Thread裸线程、Executor服务、ForkJoin框架、Actor模型。
1、Thread裸线程
线程是并发最基本的单元。Java线程本质上被映射到操作系统线程,并且每个线程对象对应着一个计算机底层线程。每个线程有自己的栈空间,它占用了JVM进程空间的指定一部分。
线程的接口相当简明,你只需要提供一个Runnable,调用start开始计算。没有现成的API来结束线程,你需要自己来实现。
优点是很接近并发计算的操作系统/硬件模型,并且这个模型非常简单。多个线程运行,通过共享内存通讯。最大劣势是,开发者很容易过分的关注线程的数量。
线程是很昂贵的对象,创建它们需要耗费大量的内存和时间。这是一个矛盾,线程太少,你不能获得良好的并发性;线程太多,将很可能导致内存问题,调度也变得更复杂。如果你需要一个快速和简单的解决方案,你绝对可以使用这个方法,不要犹豫。
2、Executor服务
另一个选择是使用API来管理一组线程。幸运的是,JVM为我们提供了这样的功能,就是Executor接口。它隐藏了如何处理Runnable的细节。
它仅仅说,“开发者!给我任务,我会处理它!”更酷的是,Executors类提供了一组方法,能够创建拥有完善配置的线程池和executor。我们将使用newFixedThreadPool,它创建预定义数量的线程,并且不允许线程数量超过这个预定义值。
这意味着,如果所有的线程都被使用的话,提交的命令将会被放到一个队列中等待;当然这是由executor来管理的。在它的上层,有ExecutorService管理executor的生命周期,以及CompletionService会抽象掉更多细节,作为已完成任务的队列。
如果你需要精确的控制程序产生的线程数量,以及它们的精确行为,那么executor和executor服务将是正确的选择。例如,需要仔细考虑的一个重要问题是,当所有线程都在忙于做其他事情时,需要什么样的策略?
增加线程数量或者不做数量限制?把任务放入到队列等待?如果队列也满了呢?无限制的增加队列大小?
感谢JDK,已经有很多配置项回答了这些问题,并且有着直观的名字,例如上面的
Executors.newFixedThreadPool(4)。
线程和服务的生命周期也可以通过选项来配置,使资源可以在恰当的时间关闭。唯一的不便之处是,对新手来说,配置选项可以更简单和直观一些。然而,在并发编程方面,你几乎找不到更简单的了。总之,对于大型系统,使用executor最合适。
3、ForkJoin框架
通过并行流,使用ForkJoinPool(FJP),Java8中加入了并行流,从此我们有了一个并行处理集合的简单方法。它和lambda一起,构成了并发计算的一个强大工具。
如果你打算运用这种方法,那么有几点需要注意。首先,你必须掌握一些函数编程的概念,它实际上更有优势。其次,你很难知道并行流实际上是否使用了超过一个线程,这要由流的具体实现来决定。如果你无法控制流的数据源,你就无法确定它做了什么。
另外,你需要记住,默认情况下是通过ForkJoinPool.commonPool实现并行的。这个通用池由JVM来管理,并且被JVM进程内的所有线程共享。这简化了配置项,因此你不用担心。
ForkJoin是一个很好的框架,当需要写一个包含并行处理的小型程序时,它是第一选择。它最大的缺点是,你必须预见到它可能产生的并发症。如果对JVM没有整体上的深入了解,这很难做到。这只能来自于经验。
4、Actor模型
JDK中没有actor的实现;因此你必须引用一些实现了actor的库。
简短地说,在actor模型中,你把一切都看做是一个actor。一个actor是一个计算实体,就像上面第一个例子中的线程,它可以从其他actor那里接收消息,因为一切都是actor。
在应答消息时,它可以给其他actor发送消息,或者创建新的actor并与之交互,或者只改变自己的内部状态。相当简单,但这是一个非常强大的概念。生命周期和消息传递由你的框架来管理,你只需要指定计算单元是什么就可以了。
另外,actor模型强调避免全局状态,这会带来很多便利。你可以应用监督策略,例如免费重试,更简单的分布式系统设计,错误容忍度等等。Akka Actors有Java接口,是最流行的JVM Actor库之一。
实际上,它也有Scala接口,并且是Scala目前默认的actor库。Scala曾经在内部实现了actor。不少JVM语言都实现了actor,比如Future。这些说明了Actor模型已经被广泛接受,并被看做是对语言非常有价值的补充。
Akka actor在内部使用ForkJoin框架来处理工作。Actor模型的强大之处来自于Props对象的接口,通过接口我们可以为actor定义特定的选择模式,定制的邮箱地址等。结果系统也是可配置的,只包含了很少的活动件。
这是一个很好的迹象!使用Actor模型的一个劣势是,它要求你避免全局状态,因此你必须小心的设计你的应用程序,而这可能会使项目迁移变得很复杂。同时,它也有不少优点,因此学习一些新的范例和使用新的库是完全值得的。
可以看出Scala非常简单,它的并发线程你无需跟线程啊,锁啊,线程间通信,线程间协同等难题打交道。它把这些都封装起来了。
用Java实现多线程有哪些途径
1,创建Thread类的子类
在这个途径中,用户程序需要创建自己的Thread类的子类,并在子类中重新定义自己的run()方法,这个run()方法中包含了用户线程的操作。这样在用户程序需要建立自己的线程时,它只需要创建一个已定义好的Thread子类的实例就可以了。
例:
public class TestThread{
...(中间的就不写了)
}
class Test1 extends Thread{
public void run(){
...............
}
}
2.实现Runnable接口
在这个途径中,已经有了一个父类的用户类可以通过实现Runnable接口的方法来定义用户线程的操作。Runnable接口只有一个方法run(),实现这个借口,就必须要定义run()方法的具体内容,用户新建线程的操作也就由这个方法来决定。定义好run()方法之后,当用户程序需要建立新线程时,只要以这个实现了run()方法的类对象为参数创建系统类Thread的对象,就可以把用户实现的run()方法借用过来。
public class TestRunnable implements Runnable{
Lable prompt1= new Label("1");
Lable prompt2= new Label("2");
.......
Thread thread1,thread2;
.......
}
public void init(){
add(.....);
.......
.......
}
public void start(){
thread1= new Thread(........);//(我就写一个。)创建1,2个线程对象,其他的不写了
thread1.start();
}
public void run(){........}
}
java多线程有几种实现方法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java中实现多线程一般使用两种方法、java多线程有几种实现方法的信息别忘了在本站进行查找哦。