Java多线程(一)概述及创建

  支持多线程是Java语言的特性之一,多线程使程序可以同时存在多个执行片段,根据不同的条件和环境同步或异步工作。线程与进程的实现原理类似,但它们的服务对象不同,进程代表操作系统平台中运行的一个程序,而一个程序中将包含多个线程。

  进程:

  通常将正在运行的程序成为进程,现在计算机基本都支持多进程操作,比如使用计算机可以边上网,边听音乐,然而计算机上只有一块CPU,实际上,并不能同时运行这些进程,CPU实际上是利用不同时间片段去交替执行每个进程,由于转换速度很快,使人感觉像是在同时运行。

  线程:

  在一个进程内部也可以执行多任务,可以将进程内部的任务称之为线程,线程是进程中的实体,一个进程可以拥有多个线程。

  线程必须拥有父进程,系统没有为线程分配资源,它与进程中的其他线程共享该进程的系统资源。如果一个进程中的多个线程共享相同的内存地址空间,这就意味着这些线程可以访问相同的变量和对象,这让线程之间共享信息变得更容易。

  线程的创建:

  在Java语言中,线程也是一种对象,但并不是任何对象都可以成为线程,只有实现Runnable接口或者继承了Thread类的对象才能成为线程。以下是线程创建的两种方式:

  (一)继承Thread类

  1.常用方法:

    Thread类中的常用方法包括start()、interrupt()、join()、run()方法等。其中start()和run()方法最常用,start()方法用于启动线程,run()方法为线程的主题方法,读者可以根据需要覆写run()方法。

  2.构造方法:   

public Thread();//默认构造方法,无参
public Thread(Runnable target);//基于Runable对象的构造方法,将线程的业务逻辑交由参数所传递的Runnable对象去实现
public Thread(ThreadGroup group, Runnable target);//ThreadGroup类表示一组线程,基于Runnable对象和线程分组对象的构造方法
public Thread(String name);//指定线程名称的构造函数,参数name将作为新创建的线程对象的名称
public Thread(ThreadGroup group, String name);//指定线程组别和线程名称
public Thread(Runnable target, String name);//基于Runnable对象并指定线程名称的构造方法
public Thread(ThreadGroup group, Runnable target, String name);//指定线程组别、名称和Runnable对象
public Thread(ThreadGroup group, Runnable target, String name,long stackSize);//指定线程分组、名称、Runnable对象和堆栈大小

  3.实例:

    在Java语言中要实现线程功能,可以继承java.lang.Thread类,这个类已经具备了创建和运行线程的所有必要架构,通过覆写Thread类中的run()方法,以实现用户所需要的功能,实例化自定义的Thread类,使用start()方法启动线程。

/**
 * 继承Thread类创建SimpleThread线程类,该类将创建的两个线程<br>
 * 同时在 控制台输出信息,从而实现两个任务输出信息的交叉显示
 */
public class SimpleThread extends Thread {
    // 构造方法,参数为线程名称
    public SimpleThread(String name) {
        setName(name);
    }
    // 覆盖run()方法
    public void run() {
        int i = 0;
        while (i++ < 5) {
            try {
                System.out.println(this.getName() + "执行步骤" + i);
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        SimpleThread thread1 = new SimpleThread("线程1");
        SimpleThread thread2 = new SimpleThread("线程2");
        thread1.start();
        thread2.start();
    }
}

    执行结果

  (二)实现Runnable接口

  实现Runnable接口的类就可以成为线程,Thread类就是因为实现了Runnable接口所以才具有了线程的功能。Runnable接口只有一个方法就是run()方法,实现Runnable接口后必须覆写run()方法。

public class Thread implements Runnable {}
public interface Runnable {
    public abstract void run();
}

  从本质上来讲,Runnable是java语言中用以实现线程的接口,任何实现线程功能的类都必须实现这个接口。Thread类就是因为实现了该接口,所以继承Thread的类才具有了相应的线程功能。

  虽然可以使用继承Thread类的方式实现线程,但是由于在java语言中,只能继承一个类,如果用户定义的类已经继承了其他类,就无法再继承Thread类,也就无法使用线程,于是java语言为用户提供了java.lang.Runnable接口,实现这个接口和继承Thread类具有相同的效果在实例化一个Thread对象时,可以传入一个实现Runnable接口的对象作为参数,Thread类会调用Runnable对象的run()方法,继而执行run()方法中的内容。

  实例:

/**
 * 创建SimpleRunnable类,该类实现了Runnable接口,并在run()方法中<br>
 * 每间隔0.5秒,在控制台输出一个"*"字符,直到输出15个"*"字符。
 */
public class SimpleRunnable implements Runnable {
    // 覆写run()方法
    public void run() {
        int i = 15;
        while (i-- >= 1) {
            try {
                System.out.print("*");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        Thread thread1 = new Thread(new SimpleRunnable(), "线程1");
        thread1.start();
    }
}

  执行结果

本文内容多参考书本知识,随笔记下来学习分享且方便以后查看。 

原文地址:https://www.cnblogs.com/maxudong/p/8278194.html

时间: 2024-10-13 15:15:00

Java多线程(一)概述及创建的相关文章

Java多线程——&lt;一&gt;概述、定义任务

一.概述 为什么使用线程?从c开始,任何一门高级语言的默认执行顺序是“按照编写的代码的顺序执行”,日常开发过程中写的业务逻辑,但凡不涉及并发的,都是让一个任务顺序执行以确保得到想要的结果.但是,当你的任务需要处理的业务比较多时,且这些业务前后之间没有依赖(比如, a执行的过程中b也可以执行,b没有必要必须等待a执行完毕再去执行),那么此时,我们可以将一个任务拆分成多个小任务. 例如,任务a负责接收键盘的输入,b负责将一些参数及计算提前做好(假设计算量比较大),c负责将a的输入和b的结果做和.此时

Java多线程之线程的创建

好久没有更博客了,最近一直在忙工作的事情.现在终于空下来了,这2天会抓紧时间整理多线程和socket,把JavaSE结束掉. 关于多线程,首先会涉及到哪些东西呢?首先要了解线程,为什么要使用线程,线程有什么优势,线程和进程有什么区别呢?了解过大致的线程内容后,就应该编码来实现Java的多线程了.首先2种方式来创建线程类,然后调用对应的API来控制线程.然后还剩下一个最大的也是最重要的一块知识,就是线程同步.前面那些了解线程的生命周期就可以,实际编码中并不会多次写到那些编码,但是线程的同步经常要用

java多线程基本概述

1.1.概念: 进程:进程是操作系统结构的基础,是一次程序的执行:是一个程序及其数据再处理器上顺序执行时所发生的活动:是程序再一个数据集合上运行的过程,它是系统进行系统资源分配和调度的最小单元. 线程:可以理解为一个程序的不同执行路径,是程序执行流的最小单元.线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源.一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发

java多线程的两个创建方法

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承,

java多线程基本概述(九)——ThreadLocal

public interface Lock Lock implementations provide more extensive locking operations than can be obtained using synchronized methods and statements. //Lock对象提供比同步方法或者同步块更多的灵活性和拓展性,They allow more flexible structuring, may have quite different propert

java多线程基本概述(二十二)——CountDownLatch(2017-04-20 18:54)

它被用来同步一个或者多个任务,轻质它们等待由其他任务执行的一组操作完成. 你可以向 CountDownLatch 对象设置一个初始计数值,任何在这个对象上调用  await()  的方法都将阻塞,直到这个计数值为0.其他任务在结束其工作时,可以在该对象上调用 countDown() 来减小这个数值,这个方法不会阻塞线程. CountDownLatch 被设计为只触发一次,计数值不能被重置.如果你需要能够重置计数值的版本,则可以使用 CyclicBarrier . CountDownLatch  

java多线程基本概述(七)——join()方法

在很多情况下,主线程创建并启动子线程,如果子线程中有大量的耗时运算,主线程将早于子线程结束,如果想让主线程等待子线程结束后再结束,那么我们可以使用join()方法.调用join()方法的意思是当前线程使调用了该方法的线程执行完成然后再执行自己本身.api文档如下: public final void join(long millis, int nanos) throws InterruptedException Waits at most millis milliseconds plus nan

java多线程基本概述(六)——简单生产者消费者模式

在线程里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者.为了解决这个问题于是引入了生产者和消费者模式.下面实现一个简单的生产者消费者模式: 1.一个消费者一个生产者循环消费生产 package soarhu; import java.util.ArrayList; import java.util.Lis

Java多线程Thread使用匿名内部类创建的两种方式

匿名内部类实现线程的两种方式: 第一种方式: 1.继承Thread类 2.重写run方法 3.将要执行的代码写在run方法中 第二种方式: 1.将Runnable的子类对象传递给Thread的构造方法 2.重写run方法 3.将执行的代码写在run方法中,最后我们开启线程 package com.yyx.thread; /** * 匿名内部类创建线程 yyx 2018年2月4日 */ public class AnonymousThread { public static void main(S