【Java】多线程系列02(常用的实现多线程的两种方式)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ooo123lll/article/details/81233528

常用的实现多线程的2种方式:Thread 和 Runnable。
说常用是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程。先对的Thread和Runnable进行了解。本章内容包括:

1、Thread和Runnable简介

Runnable是一个接口,该接口中只包含了一个run()方法。Runnable的作用,实现多线程。我们可以定义一个类A实现Runnable接口,然后,通过new Thread(new A())等方式新建线程。它的定义如下:

public interface Runnable {
    public abstract void run();
}

Thread 是一个类。Thread本身就实现了Runnable接口。Thread的作用,实现多线程。它的声明如下:

public class Thread implements Runnable {}

2、Thread和Runnable的异同点

Thread 和 Runnable 的相同点:都是“多线程的实现方式”。
Thread 和 Runnable 的不同点

  • Thread 是类,而Runnable是接口;Thread本身是实现了Runnable接口的类。我们知道“一个类只能有一个父类,但是却能实现多个接口”,因此Runnable具有更好的扩展性。
  • 此外,Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源。
  • 通常,建议通过“Runnable”实现多线程。

3、Thread和Runnable的多线程示例

3.1 Thread的多线程示例

下面通过示例更好的理解Thread和Runnable,借鉴网上一个例子比较具有说服性的例子。

// ThreadTest.java 源码
class MyThread extends Thread{  
    private int ticket=10;  
    public void run(){
        for(int i=0;i<20;i++){ 
            if(this.ticket>0){
                System.out.println(this.getName()+" 卖票:ticket"+this.ticket--);
            }
        }
    } 
};

public class ThreadTest {  
    public static void main(String[] args) {  
        // 启动3个线程t1,t2,t3;每个线程各卖10张票!
        MyThread t1=new MyThread();
        MyThread t2=new MyThread();
        MyThread t3=new MyThread();
        t1.start();
        t2.start();
        t3.start();
    }  
}

运行结果:

Thread-0 卖票:ticket10
Thread-1 卖票:ticket10
Thread-2 卖票:ticket10
Thread-1 卖票:ticket9
Thread-0 卖票:ticket9
Thread-1 卖票:ticket8
Thread-2 卖票:ticket9
Thread-1 卖票:ticket7
Thread-0 卖票:ticket8
Thread-1 卖票:ticket6
Thread-2 卖票:ticket8
Thread-1 卖票:ticket5
Thread-0 卖票:ticket7
Thread-1 卖票:ticket4
Thread-2 卖票:ticket7
Thread-1 卖票:ticket3
Thread-0 卖票:ticket6
Thread-1 卖票:ticket2
Thread-2 卖票:ticket6
Thread-2 卖票:ticket5
Thread-2 卖票:ticket4
Thread-1 卖票:ticket1
Thread-0 卖票:ticket5
Thread-2 卖票:ticket3
Thread-0 卖票:ticket4
Thread-2 卖票:ticket2
Thread-0 卖票:ticket3
Thread-2 卖票:ticket1
Thread-0 卖票:ticket2
Thread-0 卖票:ticket1

结果说明:
(01) MyThread继承于Thread,它是自定义个线程。每个MyThread都会卖出10张票。
(02) 主线程main创建并启动3个MyThread子线程。每个子线程都各自卖出了10张票。

3.2 Runnable的多线程示例

下面,我们对上面的程序进行修改。通过Runnable实现一个接口,从而实现多线程。

// RunnableTest.java 源码
class MyThread implements Runnable{  
    private int ticket=10;  
    public void run(){
        for(int i=0;i<20;i++){ 
            if(this.ticket>0){
             System.out.println(Thread.currentThread().getName()+" 卖票:ticket"+this.ticket--);
            }
        }
    } 
}; 

public class RunnableTest {  
    public static void main(String[] args) {  
        MyThread mt=new MyThread();

        // 启动3个线程t1,t2,t3(它们共用一个Runnable对象),这3个线程一共卖10张票!
        Thread t1=new Thread(mt);
        Thread t2=new Thread(mt);
        Thread t3=new Thread(mt);
        t1.start();
        t2.start();
        t3.start();
    }  
}
Thread-0 卖票:ticket10
Thread-2 卖票:ticket8
Thread-1 卖票:ticket9
Thread-2 卖票:ticket6
Thread-0 卖票:ticket7
Thread-2 卖票:ticket4
Thread-1 卖票:ticket5
Thread-2 卖票:ticket2
Thread-0 卖票:ticket3
Thread-1 卖票:ticket1

结果说明:
(01) 和上面“MyThread继承于Thread”不同;这里的MyThread实现了Thread接口。
(02) 主线程main创建并启动3个子线程,而且这3个子线程都是基于“mt这个Runnable对象”而创建的。运行结果是这3个子线程一共卖出了10张票。这说明它们是共享了MyThread接口的。

展开阅读全文

多线程两种定义方式

04-29

<span style="font-size:24px;color:#E53333;">整体介绍:</span><br />rn<span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本进阶篇面向的学员不再是完全的编程“小白”,而是具备一定C#编程经验,需要进一步查漏补缺、或者需要进一步全面完善自己C#编程知识体系的广大Unity学员。相信通过本进阶篇的学习,可以使得Unity初中级开发人员对于编程语言的掌握更进一步;对于开发中大型游戏项目,在编程语言这一层级进一步打下坚实的语言基础。</span><br />rn<br />rn<span style="font-size:24px;color:#E53333;">“中级/进阶篇”讲解特点与内容:</span><br />rn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size:18px;">&nbsp;&nbsp; 本“中级”与“进阶”篇, 是面向初中级游戏研发人员,以及Unity中高级学习者。为了更加深入的刨析各个语法的本质,我们采用反编译解读IL中间语言的方式,来解构语法重点与难点。 中级篇内容主要讲解: .Net 框架、里氏替换原则(LSP)、类的属性极其本质特性、IS ,AS 关键字、字符串的“驻留性” 原理、深入解析Equals() 原理、枚举类型、自定义集合、深入解析动态集合特性与内部原理、泛型集合、泛型约束、初级委托与事件讲解等。</span><br />rn<br />rn<span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "进阶篇"是在中级篇的基础之上,进一步研究与讲解关于IO操作、序列化、正则表达式、系统委托(Action、Function、Predicate等)、反射原理与特性、Linq查询表达式、多线程、线程池、任务、Socket套接字编程(Tcp与UDP协议),以及最后使用Unity开发具备实战价值的通讯聊天程序等。</span><br />rn<br />rn&nbsp;<br />rn<span style="font-size:24px;color:#E53333;">C#“进阶篇”教学详细说明如下:</span><br />rn<br />rn<span style="font-size:18px;">1: IO操作与序列化</span><br />rn<span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 学习文件、目录、二进制文件、文本文件的读取与写入底层原理。学习文件序列化与反序列化技能。</span><br />rn<br />rn<span style="font-size:18px;">2: 正则表达式</span><br />rn<span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 学习正则表达式的强大作用与常用原字符的含义与应用场景。</span><br />rn<br />rn<span style="font-size:18px;">3: 深入委托与事件</span><br />rn<span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 学习Action、Func、Predicate 系统内置委托类型,已经适用场合。学习匿名方法、Lambda表达式。深入解析委托与事件的区别。</span><br />rn<br />rn<br />rn<span style="font-size:18px;">4: 反射与特性</span><br />rn<span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 学习反射的概念与动态调用的重要应用价值,以及Type、Assembley核心类等,最后讲解“特性”技术。</span><br />rn<span style="font-size:18px;">&nbsp;</span><br />rn<span style="font-size:18px;">5: Linq 查询表达式</span><br />rn<span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp; 学习Linq 查询表达式对于“对象集合”(支持IEnumberable 或IEnumberable&lt;T&gt;) 以及SQL数据库、XML文档方面的强大查询功能。</span><br />rn<span style="font-size:18px;">&nbsp;&nbsp;&nbsp; &nbsp;</span><br />rn<span style="font-size:18px;">6: 多线程</span><br />rn<span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp; 学习多线程以及线程传参、线程取得返回数值技术,前台与后台线程、线程的同步、线程池、任务等技术。</span><br />rn<span style="font-size:18px;">&nbsp;&nbsp; &nbsp;</span><br />rn<span style="font-size:18px;">7: Socket套接字通讯</span><br />rn<span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp; 学习Socket套接字通讯中,Tcp与UPD通讯协议的不同应用场景,以及各自的演示示例,最后用Unity开发一款实用性的聊天通讯工具。</span><br />rn<br />rn<p>rn <span style="font-size:24px;color:#E53333;"><strong>温习提示:</strong></span> rn</p>rn<p>rn <span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:18px;"> 本C# for Unity 使用Virtual Studio2012,以及Unity5.2 进行开发与讲解。(学员使用更高版本,对学习没有任何影响)。&nbsp;&nbsp;&nbsp; &nbsp; <br />rn</span> rn</p>rn<br />

没有更多推荐了,返回首页