`
badpie
  • 浏览: 5464 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java Code之线程(二)

阅读更多

Java提供了Thread类来创建线程,具体看代码

 

新建下载线程类

package com.iteye.badpie.javacode.thread;

import java.util.Random;

public class DownloadThread extends Thread {

    private static final String TAG = DownloadThread.class.getSimpleName();
    private String mMovie;
    private Random mRandom;

    public DownloadThread(Random random, String movie) {
        mRandom = random;
        mMovie = movie;
    }

    @Override
    public void run() {
        log(TAG, "电影 " + mMovie + " 开始下载");
        for (int i = 0; i < 100;) {
            // 模拟网络下载,随机耗时
            synchronized (this) {
                try {
                    int time = mRandom.nextInt(5000);
                    wait(time);
                    i += 20;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            log(TAG, "电影 " + mMovie + " 下载进度... " + i + "%");
        }
        log(TAG, "电影 " + mMovie + " 下载结束");
    }

    private void log(String TAG, Object message) {
        System.out.println(String.format("%s : %s", TAG, message));
    }

}

 

这样启动线程

package com.iteye.badpie.javacode.thread;

import java.util.Random;

public class Main {

    public static void main(String[] args) {
        System.out.println("主线程开始运行");

        Random random = new Random(System.currentTimeMillis());

        DownloadThread download1 = new DownloadThread(random, "黎明破晓");
        download1.start();

        DownloadThread download2 = new DownloadThread(random, "人再囧途之泰囧");
        download2.start();

        System.out.println("主线程运行结束");
    }

}

  某一次执行结果如下:

主线程开始运行
主线程运行结束
DownloadThread : 电影 人再囧途之泰囧 开始下载
DownloadThread : 电影 黎明破晓 开始下载
DownloadThread : 电影 黎明破晓 下载进度... 20%
DownloadThread : 电影 人再囧途之泰囧 下载进度... 20%
DownloadThread : 电影 黎明破晓 下载进度... 40%
DownloadThread : 电影 黎明破晓 下载进度... 60%
DownloadThread : 电影 人再囧途之泰囧 下载进度... 40%
DownloadThread : 电影 黎明破晓 下载进度... 80%
DownloadThread : 电影 黎明破晓 下载进度... 100%
DownloadThread : 电影 黎明破晓 下载结束
DownloadThread : 电影 人再囧途之泰囧 下载进度... 60%
DownloadThread : 电影 人再囧途之泰囧 下载进度... 80%
DownloadThread : 电影 人再囧途之泰囧 下载进度... 100%
DownloadThread : 电影 人再囧途之泰囧 下载结束

又一次执行结果如下:

主线程开始运行
主线程运行结束
DownloadThread : 电影 黎明破晓 开始下载
DownloadThread : 电影 人再囧途之泰囧 开始下载
DownloadThread : 电影 黎明破晓 下载进度... 20%
DownloadThread : 电影 人再囧途之泰囧 下载进度... 20%
DownloadThread : 电影 黎明破晓 下载进度... 40%
DownloadThread : 电影 人再囧途之泰囧 下载进度... 40%
DownloadThread : 电影 人再囧途之泰囧 下载进度... 60%
DownloadThread : 电影 人再囧途之泰囧 下载进度... 80%
DownloadThread : 电影 黎明破晓 下载进度... 60%
DownloadThread : 电影 人再囧途之泰囧 下载进度... 100%
DownloadThread : 电影 人再囧途之泰囧 下载结束
DownloadThread : 电影 黎明破晓 下载进度... 80%
DownloadThread : 电影 黎明破晓 下载进度... 100%
DownloadThread : 电影 黎明破晓 下载结束

 感觉到线程的魅力了么?

这里创建的两个下载线程,下载《黎明破晓》的download1,下载《人再囧途之泰囧》的download2。这里不能确定这两个电影哪个先开始下载,哪个先下载结束。并且,明明main方法运行结束了,也就是主线程运行结束了,而这两个下载任务(两个子线程)还在运行。所以说线程的运行是独立的,并且互不干扰。

一个线程的运行周期就是其run方法(Thread类的run方法),run方法执行结束,该线程也就执行结束了。启动一个线程就调用其start方法(Thread类的start方法)。

 

来看更多的线程的例子

package com.iteye.badpie.javacode.thread;


public class Main {

    public static void main(String[] args) {
        System.out.println("主线程开始运行");

        new Thread() {

            @Override
            public void run() {
                System.out.println("使用匿名内部类构建子线程");
            }

        }.start();

        System.out.println("主线程运行结束");
    }

}
 

Thread原生支持Runnable方式的调用

package com.iteye.badpie.javacode.thread;

public class Main {

    public static void main(String[] args) {
        System.out.println("主线程开始运行");

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("Runnable接口");
            }
        };

        // 使用Runnable构建线程,最终线程的执行会调用到Runnable接口的run方法。
        new Thread(runnable).start();

        System.out.println("主线程运行结束");
    }

}

执行结果如下:

主线程开始运行
主线程运行结束
Runnable接口 

 

也可以扩展自定义接口

package com.iteye.badpie.javacode.thread;

public class DownloadThread extends Thread {

    private IDownloadTask mTask;

    public DownloadThread(IDownloadTask task) {
        mTask = task;
    }

    @Override
    public void run() {
        System.out.println("执行下载任务");
        mTask.download();
    }

    public interface IDownloadTask {
        public void download();
    }

}

 如此启动

package com.iteye.badpie.javacode.thread;

import com.iteye.badpie.javacode.thread.DownloadThread.IDownloadTask;

public class Main {

    public static void main(String[] args) {
        System.out.println("主线程开始运行");

        IDownloadTask task = new IDownloadTask() {
            @Override
            public void download() {
                System.out.println("自定义下载任务开始执行");
                System.out.println("自定义下载任务执行结束");
                
            }
        };

        // 使用IDownloadTask构建DownloadThread,最终线程的执行会调用到IDownloadTask接口的download方法。
        new DownloadThread(task).start();

        System.out.println("主线程运行结束");
    }

}

执行结果如下:

主线程开始运行
主线程运行结束
执行下载任务
自定义下载任务开始执行
自定义下载任务执行结束
 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Java code Java code

    10. 多线程:Java内置对多线程的支持,可以创建并控制多个线程同时执行任务,提高程序效率。 11. 核心API:Java标准库提供大量预先定义的类和接口,如集合、IO、网络、日期时间等,方便开发者快速开发应用。 12. ...

    java基础,javacode

    Java内置对多线程的支持,通过实现Runnable接口或继承Thread类可以创建线程。此外,Java并发库提供了高级同步机制,如synchronized、Lock、Future等。 以上只是Java基础知识的一部分,实际编程中还会涉及更多的...

    Java多线程调用BlockingDeque跑批量数据的例子

    一个线程从A表读数据放入队列 N个线程从队列中取出数据,找到其在子表中的数据 对子表中的数据开3种线程:读,发email,标记状态 ...运行DispatcherMain可以测试,库结构自己可以根据code随便改成父子表关系的就行

    JAVA code example 100 例

    在本资源"JAVA code example 100 例"中,我们拥有一系列精心挑选的Java编程示例,旨在帮助开发者深入理解和应用Java语言。这个压缩包包含了从基础到高级的100个源代码实例,覆盖了Java编程的多个重要方面。下面,...

    java concurrent source code

    资深Java专家10年经验总结,全程案例式讲解,首本全面介绍Java多线程编程技术的专著 结合大量实例,全面讲解Java多线程编程中的并发访问、线程间通信、锁等最难突破的核心技术与应用实践 封底 Java多线程无处不在,...

Global site tag (gtag.js) - Google Analytics