JAVA多线程创建,创建并启动线程
Java中有三种基本的线程创建形式:
一、继承Thread类,重写该类的run()方法
继承Thread类并重写该类的run()方法。
公共类MyThread扩展线程{
@覆盖
公共无效运行(){
for(int I=0;i 50i ) {
system . out . println(thread . current thread()。getName(): I);
}
}
公共静态void main(String[] args) {
for(int I=0;i50i ) {
//调用Thread类的currentThread()方法获取当前线程
system . out . println(thread . current thread()。getName() I);
if (i==10) {
新的MyThread()。start();
新的MyThread()。start();
}
}
}
}运行结果:
.
主48
主49
线程-0:0
线程-0:1
线程0:2
线程0:3
线程0:4
线程1:0
.从结果可以看出:
1.有三个线程:main、Thread-0和Thread-1;
2.Thread-0和Thread-1输出的成员变量I的值是不连续的(这里的I是实例变量而不是局部变量)。因为:通过继承Thread类实现多线程时,每个线程都要创建一个不同的子类对象,导致Thread-0和Thread-1不能共享成员变量I;
3.线程的执行是抢占式的,并不是说Thread-0或者Thread-1一直占用CPU(这也和线程优先级有关,这里Thread-0和Thread-1的优先级相同,关于线程优先级的知识这里不展开)
(学习视频推荐:java视频教程)
二、通过实现Runnable接口创建线程类
定义一个类来实现Runnable接口;创建实例对象;这一类的;将obj作为构造函数参数传入thread类实例对象,这是真正的Thread对象。
公共类MyRunnable实现Runnable {
@覆盖
公共无效运行(){
for(int I=0;i 50i ) {
system . out . println(thread . current thread()。getName(): I);
}
}
公共静态void main(String[] args) {
for(int I=0;i 50i ) {
system . out . println(thread . current thread()。getName(): I);
if (i==10) {
my runnable my runnable=new my runnable();
新线程(myRunnable)。start();
新线程(myRunnable)。start();
}
}
//java8 labdam模式
新线程(()- {
system . out . println(thread . current thread()。getName());
},‘线程3’)。start();
}
}运行结果:
.
主要:46
主要:47
主要:48
主要:49
线程-0:28
线程-0:29
线程-0:30
线程-1:30
.1,线程1和线程2是连续的,也就是说,通过这种方式创建线程,多个线程可以共享thread类的实例变量,因为这里的多个线程都使用同一个目标实例变量。但是,当你使用上面的代码运行时,你会发现,其实有些结果是不连续的。这是因为当多个线程访问同一个资源时,如果资源没有被锁定,就会出现线程安全问题;
2.java8可以使用lambda创建多线程。
三、通过Callable和Future接口创建线程
创建一个可调用的接口实现类,实现call()方法,该方法将作为线程执行器,方法有返回值,然后创建可调用实现类的实例;用FutureTask类封装可调用对象,封装可调用对象的call()方法的返回值;使用FutureTask对象作为Thread对象的目标创建并启动一个新线程;调用FutureTask对象的get()方法获取子线程执行后的返回值。
公共类MyCallable实现CallableInteger {
private int I=0;
@覆盖
公共整数调用()引发异常{
int sum=0;
for(;i 100i ) {
system . out . println(thread . current thread()。getName() I);
sum=I;
}
返回总和;
}
公共静态void main(String[] args)引发ExecutionException、InterruptedException {
//创建一个MyCallable对象
可调用整数my callable=new my callable();
//使用未来任务来包装MyCallable对象
FutureTaskInteger英尺=新FutureTaskInteger(我的可调用);
for(int I=0;i50i ) {
系统。出去。println(线程。当前线程().getName(): I);
if (i==30) {
螺纹线程=新螺纹(英尺);
线程。start();
}
}
System.out.println(主线程为循环执行完毕.);
整数整数=英尺。get();
系统。出去。println( sum= integer);
}
}调用()方法的返回值类型与创建未来任务对象时里的类型一致。
相关教程推荐:java快速入门以上就是爪哇岛多线程的创建及启动的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。