`
shadowred
  • 浏览: 5659 次
社区版块
存档分类
最新评论

多线程学习笔记2 - 实现自己的线程

    博客分类:
  • java
阅读更多

进入正题前先了解两个名词,进程线程

 

进程:可以理解为一个应用程序,具有独立的存储空间。

 

线程:可称之为轻量级进程,占用资源小存在于进程中。所有线程共享进程公共内存。

 

总之进程和线程是(可以帮你完成某项任务的)两种基本单元。Java并发编程主要还是从线程出发。

 

什么是多线程

每个Java应用中都至少包含一个线程(main线程)。程序中的多个线程是“同时”被操作,从而提高运行效率的。对于单核CPU来说“同时”只是假象,在同一时间点有且仅有一个线程可以被执行。操作系统通过切分CPU时间,使得不同的线程在不同的时间切片上得到/失去执行权。

 

多线程技术的优点

1.线程相对于进程来说更加轻量,线程创建花费更少的资源和时间

2.线程间共享所属进程的公共内存

3.线程间上下文切换较进程有明显的优势

4.线程间的访问较进程更加简便

 

(线程的优点同时也是掌握它的难点,由于内存共享我们需要线程安全机制来确保多线程间的数据同步,关于这一部分我们后续再讨论)

 

关于线程创建API提供了两种实现方式

1.实现java.lang.Runnable接口

2.继承父类java.lang.Thread

 

实现Runnable接口

 我们可以通过封装runnable类来创建线程。而runnable类是通过实现java.lang.Runnable接口以及它的run方法获得的。当线程被调用时,run方法被执行。下面是实现Runnable接口的例子。

 

public class HeavyWorkRunnable implements Runnable {
 
    @Override
    public void run() {
        System.out.println("Doing heavy processing - START "+Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
            //Get database connection, delete unused data from DB
            doDBProcessing();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Doing heavy processing - END "+Thread.currentThread().getName());
    }
 
    private void doDBProcessing() throws InterruptedException {
        Thread.sleep(5000);
    }
 
}

 

继承Thread父类

我们可以继承java.lang.Thread父类并重写run方法来创建线程。当线程被调用时,run方法被执行。下面是继承Thread父类创建线程的例子。

 

public class MyThread extends Thread {
 
    public MyThread(String name) {
        super(name);
    }
 
    @Override
    public void run() {
        System.out.println("MyThread - START "+Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
            //Get database connection, delete unused data from DB
            doDBProcessing();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("MyThread - END "+Thread.currentThread().getName());
    }
 
    private void doDBProcessing() throws InterruptedException {
        Thread.sleep(5000);
    }
     
}

 

测试类如下

public class ThreadRunExample {
 
    public static void main(String[] args){
        Thread t1 = new Thread(new HeavyWorkRunnable(), "t1");
        Thread t2 = new Thread(new HeavyWorkRunnable(), "t2");
        System.out.println("Starting Runnable threads");
        t1.start();
        t2.start();
        System.out.println("Runnable Threads has been started");
        Thread t3 = new MyThread("t3");
        Thread t4 = new MyThread("t4");
        System.out.println("Starting MyThreads");
        t3.start();
        t4.start();
        System.out.println("MyThreads has been started");
         
    }
}

 

输出结果为

Starting Runnable threads
Runnable Threads has been started
Doing heavy processing - START t1
Doing heavy processing - START t2
Starting MyThreads
MyThread - START Thread-0
MyThreads has been started
MyThread - START Thread-1
Doing heavy processing - END t2
MyThread - END Thread-1
MyThread - END Thread-0
Doing heavy processing - END t1

 

当线程进入可执行状态(调用start方法)后,线程的执行顺序就由操作系统决定,当被分配到CPU时间时线程进入执行状态。尽管我们可以设定线程的优先度,但是它不总是管用(线程调度并不归JVM管理)。所以当我们多次运行上面的测试类时,线程起止的顺序不是确定不变的。

 

Runnable VS Thread

 如果你仅仅想创建一个线程去执行某项简单的任务你可以选择继承Thread父类。如果你想让程序更具有扩展性,执行更加多功能的任务你应该选择实现Runnable接口。

 

上面的话怎么理解呢,我们都知道Java API中一个类仅能继承一个父类,但是却可以实现复数个接口。个人更推荐通过实现Runnable接口的方式来创建线程。

 

 学习笔记3中我们将探讨线程休眠的概念。

 

参考:http://www.journaldev.com/1079/java-thread-tutorial/

分享到:
评论

相关推荐

    多线程学习笔记

    多线程学习笔记,通过平时的学习所做的一些笔记,希望对广大同仁有所帮助

    JAVA 多线程学习笔记

    这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...

    java学习笔记31 - 多线程.md

    java学习笔记31 - 多线程

    java学习笔记2(多线程)

    java学习笔记2(多线程)java学习笔记2(多线程)

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括...通过实践和不断学习,你将成为一个多线程编程的专家。

    UNIX多线程学习笔记

    【UNIX多线程学习笔记】 在UNIX操作系统中,多线程是一种重要的编程模型,它允许多个执行流在单个进程中并发运行。多线程带来了许多优势,包括提高应用程序响应速度,充分利用多CPU系统的资源,以及优化程序结构,...

    java线程学习笔记

    Java 线程学习笔记 Java 线程创建有两种方法: 1. 继承 Thread 类,重写 run 方法:通过继承 Thread 类并重写 run 方法来创建线程,这种方法可以使线程具有自己的执行逻辑。 2. 实现 Runnable 接口:通过实现 ...

    多线程 学习笔记.md

    多线程 学习笔记.md

    java多线程学习笔记

    在本文中,我们将深入探讨Java多线程的相关知识点,并结合提供的源代码进行学习。 1. **线程的创建** - **实现Runnable接口**:创建一个类实现Runnable接口,然后将其实例传递给Thread类的构造函数,如`Thread t =...

    多线程学习笔记与学习

    本篇笔记将深入探讨多线程的各个方面,包括其定义、作用以及如何在Windows环境中进行多线程编程。 首先,进程和线程是操作系统中的基本执行单位。进程是程序的实例,拥有独立的虚拟内存空间和系统资源,当进程结束...

    马士兵多线程笔记.zip

    在IT领域,多线程是程序设计中...马士兵的多线程训练营资料1和资料2可能涵盖了以上这些知识点的详细讲解,通过学习这些内容,开发者可以掌握多线程编程的基本技能,解决实际项目中的并发问题,提升软件的性能和稳定性。

    android 学习笔记6-HttpClient 多线程下载 断点续传 进度条 源码关联

    4、多线程下载:使用RandomAccessFile输出流写 5、多线程下载-断点续传:使用临时文件记录当前下载的数据,下次读取文件开始下载 6、下载显示进度条-ProgressBar 7、在gitbub上面下载已经有支持断点续传功能的代码...

    C++多线程学习笔记1

    这份"C++多线程学习笔记1"涵盖了基础到进阶的多线程概念,旨在帮助初学者快速掌握这一关键技能。 首先,C++11引入了对多线程的支持,引入了`<thread>`库,使得创建和管理线程变得简单。创建一个新的线程可以使用`...

    马士兵多线程训练营笔记

    通过马士兵的多线程训练营笔记,开发者不仅可以学习到多线程的基本概念,还能掌握高级并发编程技巧,这对于开发高并发、高性能的应用至关重要。在阅读和学习这些笔记时,结合实际的编程练习将有助于更好地理解和巩固...

    Python3的多线程学习笔记[定义].pdf

    本篇学习笔记主要涵盖了线程基础、threading模块的使用以及线程同步控制。 首先,线程是操作系统分配CPU执行时间的基本单位,一个进程可以包含多个线程。在Python3中,线程的状态主要包括新建、就绪、运行、死亡、...

    java笔记.zip

    2020-4-6 java笔记 --多线程 2020-4-8 java笔记 String类 2020-4-9 java 比较器 2020-4-10 java笔记 枚举类 2020-4-10 java 注解(Annotation) 2020-4-11 Java 集合 2020-4-15 java 泛型 2020-4-18 java IO流 2020-...

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....

    多线程-狂神说Java学习笔记

    本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...

    Java学习笔记---

    4. **Java的多线程支持**:Java语言内置了对多线程的支持,允许开发者在同一个程序中创建并管理多个执行线程,增强了程序的并发能力。 5. **动态性**:Java是动态的,它允许程序在运行时加载和使用新的类,这是C++...

Global site tag (gtag.js) - Google Analytics