• Java中多线程的创建


     多线程的创建

    方法一:继承于Thread类

    1.遍历100以内的所有偶数
     1 /*
     2  *多线程的创建
     3  *一.继承于Thread类
     4  *1.创建一个Thread类的子类
     5  *2.重写Thread类的run()->将此线程执行的操作声明在run()方法中
     6  *3.创建Thread类的子类的对象
     7  *4.通过此对象调用start():(1)启动当前线程(2)调用当前线程的run()方法
     8  */
     9 //遍历100以内的所有偶数
    10 
    11 class MyThread extends Thread
    12 {
    13     @Override//重写run()
    14     public void run() {
    15         for(int i=0;i<100;i++)
    16         {
    17             if((i&1)==1)
    18                 System.out.println(i);
    19         }
    20     }
    21 }
    22 public class test {
    23 public static void main(String[] args) {
    24     MyThread t1=new MyThread();//在主线程中建立子类对象
    25     t1.start();//对象调用start()方法,第二个线程开始执行
    26     //t1.run();如果调用run则不会使用多个进程
    27     //如果还想再执行start(),不能用已经执行过start()的进程的对象,否则会报IllegalThreadStateException,可以再重新创建一个类对象
    28     MyThread t2=new MyThread();
    29     t2.start();
    30     //第二个执行的同时,主线程执行下面过程
    31     for(int i=0;i<100;i++)
    32     {
    33         if((i&1)==0)
    34             System.out.println("*"+i+"*");
    35     }
    36 }
    37 }
    2.建立两个线程,分别遍历100以内的所有偶数和奇数
     1 //建立两个线程,分别遍历100以内的所有偶数和奇数
     2 //可以通过创建Thread匿名子类的方法
     3 class MyThread extends Thread
     4 {
     5     @Override//重写run()
     6     public void run() {
     7         /*for(int i=0;i<100;i++)
     8         {
     9             if((i&1)==1)
    10                 System.out.println(i);
    11         }*/
    12     }
    13 }
    14 public class test {
    15 public static void main(String[] args) {
    16     
    17     new Thread() {
    18         public void run() {
    19             for(int i=0;i<100;i++)
    20             {
    21                 if((i&1)==1)
    22                     System.out.println(i);
    23             }
    24         }
    25     }.start();
    26     for(int i=0;i<100;i++)
    27     {
    28         if((i&1)==0)
    29             System.out.println("*"+i+"*");
    30     }
    31     new Thread() {
    32          public void run() {
    33                 for(int i=0;i<100;i++)
    34                 {
    35                     if((i&1)==0)
    36                         System.out.println("*"+i);
    37                 }
    38             }
    39     }.start();
    40 }
    41 }

    方法二:实现Runnable接口

     1 /*
     2  * 创建多线程的方式二:实现Runnable接口
     3  * 1.创建一个类实现Runnable接口
     4  * 2.实现类去实现Runnable中的抽象方法:run()
     5  * 3.创建实现类的对象
     6  * 4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
     7  * 5.通过Thread类的对象调用start()
     8  */
     9 class MyThread implements Runnable
    10 {
    11     public void run()
    12     {
    13         for(int i=0;i<100;i++)
    14         {
    15             if((i&1)==0)
    16             {
    17                 System.out.println(Thread.currentThread().getName()+i);
    18             }
    19         }
    20     }
    21 }
    22 
    23 /*源码
    24    target定义
    25       //What will be run. 
    26    private Runnable target;
    27 
    28    Thread的构造器
    29      public Thread(Runnable target) {
    30        init(null, target, "Thread-" + nextThreadNum(), 0);
    31     }
    32     
    33    重写run()
    34         @Override
    35     public void run() {
    36         if (target != null) {
    37             target.run();
    38         }
    39     }
    40 
    41  */
    42 public class test {
    43     public static void main() {
    44 MyThread mythread=new MyThread();
    45 Thread t1=new Thread(mythread);
    46 /*
    47  * 通过Thread类的对象调用start():(1)启动线程(2)调用当前线程的run()
    48  * t1.start()其实调用了当前线程的run()
    49  * 通过看上面的源码发现即调用Runnable类型的target的run
    50  * 也就是这里的MyThread.run()
    51  */
    52 t1.start();
    53 Thread t2=new Thread(mythread);
    54 t2.start();
    55 }
    56 }

    两种创建线程的方法比较:

    开发中优先选择实现Runnable接口的方式

    原因:

    1.实现的方式没有类的单继承的局限性

    2.实现的方式更适合来处理多个线程有共享数据的情况

    联系:Thread类本身也实现了Runnable接口 public class Thread implements Runnable

    相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()方法中。

  • 相关阅读:
    ListComparer
    C#.net中类与结构的区别
    对C# 中堆栈,堆,值类型,引用类型的理解
    一道面试题
    Mvc不等于三层架构
    SQL养成一个好习惯是一笔财富
    清除MSSQL事务日志文件
    面向对象设计(OOD)五大基本原则
    .net/c#中栈和堆的区别及代码在栈和堆中的执行流程详解之一
    IIS7 Login failed for user IIS APPPOOL\ASP.NET v4.0
  • 原文地址:https://www.cnblogs.com/zuiaimiusi/p/10831737.html
Copyright © 2020-2023  润新知