Thread的使用

思维导图如下


Thread.png

进程是程序的一次动态执行过程,它需要经历从代码加载,代码执行到执行完毕的一个完整的过程,这个过程也是进程本身从产生,发展到最终消亡的过程。多进程操作系统能同时达运行多个进程(程序),由于 CPU 具备分时机制,所以每个进程都能循环获得自己的CPU 时间片。由于 CPU 执行速度非常快,使得所有程序好像是在同时运行一样。
多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并发的一个基本单位。线程是比进程更小的执行单位,线程是进程的基础之上进行进一步的划分。所谓多线程是指一个进程在执行过程中可以产生多个更小的程序单元,这些更小的单元称为线程,这些线程可以同时存在,同时运行,一个进程可能包含多个同时执行的线程。
在 Java 中实现多线程有两种手段,一种是继承 Thread 类,另一种就是实现 Runnable 接口。
Thread 类和 Runnable 接口之间在使用上也是有区别的,如果一个类继承 Thread类,则不适合于多个线程共享资源,而实现了 Runnable 接口,就可以方便的实现资源的共享。

一个多线程的程序如果是通过 Runnable 接口实现的,则意味着类中的属性被多个线程共享,那么这样就会造成一种问题,如果这多个线程要操作同一个资源时就有可能出现资源同步问题。
解决方法:

同步代码块

synchronized(同步对象){ 
 需要同步的代码 
}

实例代码如下:

class MyThread implements Runnable{ 
    private int ticket = 5 ;    // 假设一共有5张票 
    public void run(){ 
        for(int i=0;i<100;i++){ 
            synchronized(this){ // 要对当前对象进行同步 
                if(ticket>0){   // 还有票 
                    try{ 
                        Thread.sleep(300) ; // 加入延迟 
                    }catch(InterruptedException e){ 
                        e.printStackTrace() ; 
                    } 
                    System.out.println("卖票:ticket = " + ticket-- ); 
                } 
            } 
        } 
    } 
}; 
public class SyncDemo02{ 
    public static void main(String args[]){ 
        MyThread mt = new MyThread() ;  // 定义线程对象 
        Thread t1 = new Thread(mt) ;    // 定义Thread对象 
        Thread t2 = new Thread(mt) ;    // 定义Thread对象 
        Thread t3 = new Thread(mt) ;    // 定义Thread对象 
        t1.start() ; 
        t2.start() ; 
        t3.start() ; 
    } 
};

同步方法

synchronized 方法返回值 方法名称(参数列表){ 

}
class MyThread implements Runnable{ 
    private int ticket = 5 ;    // 假设一共有5张票 
    public void run(){ 
        for(int i=0;i<100;i++){ 
            this.sale() ;   // 调用同步方法 
        } 
    } 
    public synchronized void sale(){    // 声明同步方法 
        if(ticket>0){   // 还有票 
            try{ 
                Thread.sleep(300) ; // 加入延迟 
            }catch(InterruptedException e){ 
                e.printStackTrace() ; 
            } 
            System.out.println("卖票:ticket = " + ticket-- ); 
        } 

    } 
}; 
public class SyncDemo03{ 
    public static void main(String args[]){ 
        MyThread mt = new MyThread() ;  // 定义线程对象 
        Thread t1 = new Thread(mt) ;    // 定义Thread对象 
        Thread t2 = new Thread(mt) ;    // 定义Thread对象 
        Thread t3 = new Thread(mt) ;    // 定义Thread对象 
        t1.start() ; 
        t2.start() ; 
        t3.start() ; 
    } 
};

其实就是在实现了Runnable接口的类中的run方法中写代码,然后new一个Thread,用Thread的start方法来启动另外的线程去执行run方法中的代码
参考文章
Java多线程看这一篇就足够了

-------------------------------------------------------------------------

android开发艺术中关于HandlerThread的介绍

HandlerThread的run方法是一个无限循环,因此当明确不需要再使用Handler时,可以通过它的quit或者quitSafely方法来终止线程的执行。代码如下所示:

 HandlerThread handlerThread = new HandlerThread("我是HandlerThread");
        handlerThread.start();
        Handler handler = new Handler(handlerThread.getLooper()) {//创建Handler对象时,如果添加了Loop参数,那么Handler将被创建在Loop所在的线程中
            @Override
            public void handleMessage(Message msg) {
            //这个方法是运行在 handler-thread 线程中的 ,可以执行耗时操作
                switch (msg.what) {
                    case 0:
                        Log.d("CeShi",Thread.currentThread().getName()+ ":收到了");
                        break;
                    default:
                        break;
                }
            }
        };
        handler.sendEmptyMessage(0);//在主线程给handler发送消息
        /*输出结果为:
        05-24 18:29:57.487 32249-32266/? D/CeShi: 我是HandlerThread:收到了*/

参考文章
https://www.cnblogs.com/zhaoyanjun/p/6062880.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,797评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,174评论 18 399
  • 下面是我自己收集整理的Java线程相关的面试题,可以用它来好好准备面试。 参考文档:-《Java核心技术 卷一》-...
    阿呆变Geek阅读 15,001评论 14 507
  • 我有两个自己 一个用来爱 一个用来承受 影子是承受的最真实的存在 比起影子 更爱最初的心 如果微笑给不了别人温暖 ...
    汐的岛阅读 2,593评论 0 1
  • 《代码大全》第5章 软件构建中的设计 读书笔记 管理软件的复杂度 设计层次 1. 软件系统 2. 子系统或包 常用...
    息魇阅读 4,540评论 0 0