ADeveloperH Blog

Meet a better self !

Android 周边技术分享


Java多线程的两种实现方案

首先,我们知道Java多线程实现的两种方案分别为:
1、继承Thread类
2、实现Runnable接口

1 继承Thread实现多线程

直接看代码实现:

package com.example.thread.one;    

public class ThreadDemo {  
    public static void main(String[] args) {  
        MyThread mThread = new MyThread();//新建线程  
        mThread.start();//线程处于就绪状态,拿到时间片后会自动执行run()方法里面的代码块  
    }  
      
}  
class MyThread extends Thread{  
    @Override  
    public void run() {  
        super.run();  
        /** 
         * 这里写需要在子线程中执行的 
         * 比较耗时的操作。 
         */  
        System.out.println("子线程执行了比较耗时的操作");  
    }  
}  
  • 问题1、为什么要重写run()方法?

因为run()方法里面封装的是要被该线程执行的代码

  • 问题2、run()方法和start()方法的区别?

如果直接调用run()方法就是普通的方法调用,调用start()方法是先启动线程,获取到cpu执行权后由JVM调用其中的run()方法

2 实现Runnable接口实现多线程

直接看代码实现过程:

package com.example.thread.one;  
  
public class ThreadDemo {  
    public static void main(String[] args) {  
        MyRunnable mRunnable = new MyRunnable();  
        //创建线程,需要传入一个Runable对象作为参数  
        Thread thread = new Thread(mRunnable);  
        //线程处于就绪状态,如果分配到时间片会自动执行Runnable中的run()方法  
        thread.start();  
    }  
      
}  
class MyRunnable implements Runnable{  
  
    @Override  
    public void run() {  
        /** 
         * 这里写需要在子线程中执行的 
         * 比较耗时的操作。 
         */  
        System.out.println("子线程执行耗时操作");  
    }  
      
}  

3 两种实现方法的区别

实现Runnable接口带来的好处:

  1. 避免JAVA单继承带来的局限性。 由于JAVA是单继承的,如果当前自定义的类已经继承了一个类,就不能再继承Thread类来实现多线程了,但是,我们可以通过实现Runnable来避免这个局限性,同时JAVA还是多实现的,可以同时实现多个接口,因此实现Runnable接口更加的方便。
  2. 适合多个相同的程序代码去处理同一个资源的情况,把线程同程序的代码、数据有效的分离,较好的体现面向对象的设计思想。 当多个线程需要处理同一资源时,我们可以将资源在Runnable接口中定义,这样,创建Thread对象时传入相同的Runnable对象就可以实现多线程资源的共享(注:这里需要考虑多线程的线程安全问题,需要考虑同步的问题)

例如下面的代码:

package com.example.thread.one;  
  
public class ThreadDemo {  
    public static void main(String[] args) {  
        MyRunnable mRunnable = new MyRunnable();  
        //创建线程,这里两个线程传入相同的Runnable对象  
        Thread thread1 = new Thread(mRunnable);  
        Thread thread2 = new Thread(mRunnable);  
          
        //线程处于就绪状态,如果分配到时间片会自动执行Runnable中的run()方法  
        thread1.start();  
        thread2.start();  
    }  
      
}  
class MyRunnable implements Runnable{  
    //被多个线程共享的资源  
    private int count = 100;  
    @Override  
    public void run() {  
        for (int i = 0; i < 50; i++) {  
            System.out.println("当前的count值:" + count--);  
        }  
    }  
      
}  
最近的文章

Java多线程安全典型案例

1 问题引入通过最常见的多窗口售票问题引入线程安全的问题。注:这里使用Runnable接口来实现线程,这样做是为了共享代售票这个资源,如果我们使用继承Thread来操作,需要将代售票ticketCount设置为全局的公共变量才能实现效果。代码如下:package com.example.thread.one; public class ThreadDemo { public static void main(String[] args) { SellTic...…

继续阅读
更早的文章

Java多线程概述

1 什么是多线程1.1 理解几个概念: 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径1.2 多进程的意义提高CPU的使用率。单进程的计算机只能做一件事情,而我们现在的计算机都可以做多件事情。举例:一边玩游戏(游戏进程),一边听音乐(音乐进程)。也就是说现在的计算机都是支持多进程的,可以在一个时间段内执行多个任务。并且呢,可以提高CPU的使用率。1.3 多线程的意义提高应用程序的使用率。多线程的存在...…

继续阅读