zoukankan      html  css  js  c++  java
  • 初识java 多线程

     1 //方法一:利用extends Thread方式创建线程
     2 //要点1:重写Thread中的run方法
     3 //要点2:用start方法启动
     4 public class basic extends Thread {
     5     public basic(String name){
     6         super(name);
     7     }
     8     public void run(){
     9         for(int i= 0; i<5; i++)
    10         {        try {
    11             sleep(5);//睡5毫秒,便于其他线程抢到时间片
    12         } catch (InterruptedException e) {
    13             e.printStackTrace();
    14         }
    15                 System.out.print(this.getName()+":"+i+"
    ");
    16             
    17         }
    18     }
    19     public static void main(String[] args){
    20         Thread t1 = new basic("张三");  //t1对象中的name为张三     Thread向下转型
    21         Thread t2 = new basic("李四");  //t2对象中的name为李四
    22         t1.start();
    23         t2.start();
    24     }
    25 }

    执行结果:

    (一)

    张三:0
    李四:0
    李四:1
    张三:1
    张三:2
    李四:2
    李四:3
    张三:3
    李四:4
    张三:4

    (二)

    张三:0
    李四:0
    李四:1
    张三:1
    李四:2
    张三:2
    张三:3
    李四:3
    张三:4
    李四:4      执行结果不一样

    总结 :用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。

    run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。

    把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。

     1 //方法二:声明实现Runnable接口的类
     2 //要点1:定义run方法
     3 //要点2:用start方法启动
     4 //要点3:实现Runable的类实例作为Thread构造函数的参数
     5 public class basic implements Runnable {
     6     private String name;
     7     public basic(String name){
     8         this.name = name;
     9     }
    10     public void run(){
    11         for(int i= 0; i<5; i++)
    12         {    
    13             System.out.println(name+":"+i);
    14         }
    15     }
    16     public static void main(String[] args){
    17         basic b1 = new basic("张三");
    18         basic b2 = new basic("李四");
    19         Thread t1 = new Thread(b1); // public Thread(Runnable target)
    20         Thread t2 = new Thread(b2); // Thread类也实现了Runnable接口
    21         t1.start();
    22         t2.start();
    23     }
    24 }

    运行结果一

    张三:0
    李四:0
    李四:1
    李四:2
    李四:3
    李四:4
    张三:1
    张三:2
    张三:3
    张三:4

    运行结果二

    张三:0
    李四:0
    张三:1
    张三:2
    张三:3
    张三:4
    李四:1
    李四:2
    李四:3
    李四:4

  • 相关阅读:
    Oracle之内存结构(SGA、PGA)
    学员报名WDP培训之前必须阅读
    常见滤波方法
    C++ 为什么拷贝构造函数参数必须为引用?赋值构造函数参数也必须为引用吗?
    C++ explicit关键字详解
    A、B、C、D和E类IP地址
    BOOL和bool的区别
    互斥量 临界区 信号量 条件变量 效率对比
    Unhandled exception at 0x........ in XXXX.exe: 0xC0000005:错误
    链表的插入操作错误
  • 原文地址:https://www.cnblogs.com/hxjbc/p/5166818.html
Copyright © 2011-2022 走看看