JAVA多线程创建,创建并启动线程

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

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