Java基础二十二

1 多线程的概述

1.1 进程

  • 就是正在运行的程序。是系统进行资源分配和调度的独立单位。每一个进程都有其自己的内存空间和系统资源。

1.2 多进程的意义?

  • 单进程的计算机只能做一件事情,而我们现在的计算机可以做多件事情。例如:一边玩游戏,一边听音乐。
  • 现在的计算机都支持多进程的,就可以一个时间段内执行多个任务,并且可以提高CPU的使用率。

1.3 线程

  • 在一个进程内又可以执行多个任务,而这每一个任务我们就可以看成是一个线程。
  • 线程是进程的执行单元(执行路径)。
  • 单线程:如果程序有一条执行路径。
  • 多线程:如果程序有多条执行路径。

1.4 多线程的意义?

  • 多线程的存在,不是提高程序的执行速度。其实是为了提高应用程序的使用率。
  • 程序的执行其实都是在抢CPU的资源,即CPU的执行权。
  • 多个进程是在抢这个资源,而其中的某一个进程如果执行路径比较多的话,就有更高的几率抢到CPU的执行权。
  • 线程的执行具有随机性。

1.5 Java程序的运行原理

  • Java命令会启动Java虚拟机,启动JVM,等于启动了一个进程。 该进程会自动启动一个主线程,然后由主线程去调用某个类的main方法,所以main方法运行在主线程中的。
  • JVM启动至少启动了垃圾回收线程和主线程,所以是多线程的。

2 多线程的实现方案

2.1 多线程的实现方案一

  • 步骤:
  • ①创建一个类去继承Thread类。
  • ②该子类去重写run()方法。
  • ③创建该子类的对象。
  • ④启动线程
  • 示例:
package com.xuweiwei;

/**
 * 多线程的实现:
 *  由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。
 *  而进程是由系统创建的,所以,我们应该去调用系统功能去创建一个进程。
 *  Java是不能直接带哦用系统功能的,所以,我们没有办法直接实现多线程程序。
 *  但是,Java是可以调用C或C++写好的程序去实现多线程程序。
 *  由C或C++去调用系统功能创建进程,然后由Java去调用这样的东西,然后提供一些API供我们使用。这样,我们就可以实现多线程程序了。
 */
public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"= " + i);
        }
    }
}
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start();

        MyThread t2 = new MyThread();
        t2.start();

    }
}

2.2 获取线程对象的名称和设置线程对象的名称

  • 方法:返回该线程的名称
public final String getName()
  • 方法:设置线程的名称
public final void setName(String name)
  • 方法:返回当前正在执行的线程对象的引用
public static Thread currentThread()
  • 示例:无参构造方法+setName
package com.xuweiwei;

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"= " + i);
        }
    }
}
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {

        MyThread t1 = new MyThread();

        MyThread t2 = new MyThread();

        //设置线程的名字
        t1.setName("t1");
        t2.setName("t2");

        t1.start();
        t2.start();

    }
}
  • 示例:有参构造方法
package com.xuweiwei;

public class MyThread extends Thread {

    public MyThread() {
    }

    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"= " + i);
        }
    }
}
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {

        MyThread t1 = new MyThread("t1");

        MyThread t2 = new MyThread("t2");

        t1.start();
        t2.start();

    }
}
  • 示例:获取main方法所在的线程对象的名称
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {

        System.out.println(Thread.currentThread().getName());

    }
}

2.3 线程的控制

  • 方法:线程睡眠
public static void sleep(long millis)  throws InterruptedException
  • 方法:join线程,等待该线程终止
public final void join() throws InterruptedException
  • 方法:线程礼让即暂停当前的正在执行的线程对象,并执行其他线程。
public static void yield()
  • 方法:守护线程
public final void setDaemon(boolean on)
  • 方法:中断线程
public void interrupt()
  • 示例:
package com.xuweiwei;

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread().getName()+"= " + i);
        }
    }
}
  • 示例:
package com.xuweiwei;

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "= " + i);
        }
    }
}
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();

        t1.setName("李渊");
        t2.setName("李建成");
        t3.setName("李世民");

        t1.start();
        try {
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t2.start();
        t3.start();

    }
}
  • 示例:
package com.xuweiwei;

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "= " + i);
            Thread.yield();
        }
    }
}
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();

        t1.setName("李渊");
        t2.setName("李建成");
        t3.setName("李世民");

        t1.start();
        t2.start();
        t3.start();

    }
}
  • 示例:
package com.xuweiwei;

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "= " + i);
            Thread.yield();
        }
    }
}
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {

        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();

        t2.setName("李建成");
        t3.setName("李世民");

        t2.setDaemon(true);
        t3.setDaemon(true);

        t2.start();
        t3.start();

        Thread.currentThread().setName("李渊");
        for (int i = 0; i < 3; i++) {
            System.out.println(Thread.currentThread().getName()+"= " + i);
        }

    }
}

2.4 线程的生命周期

  • 新建:创建线程对象。
  • 就绪:有执行资格,但是没有执行权。
  • 运行:有执行资格,有执行权。
  • 阻塞:由于一些操作,让线程处于该状态。没有执行资格,没有执行权。
  • 死亡:线程对象对象变成垃圾,等待被回收。

2.5 多线程的实现方式二

  • 步骤:

3 线程调度和线程控制

4 线程生命周期

5 死锁

6 线程间通信

7 定时器的使用

原文地址:https://www.cnblogs.com/xuweiweiwoaini/p/9410609.html

时间: 2024-10-13 17:27:48

Java基础二十二的相关文章

java基础知识十二

第十二章 异常 异常(Exception):又称为例外,是程序在运行过程中发生的非正常事件,其发生会影响程序的正常执行.Exception是程序级错误,可由程序本身处理:Error是系统级错误,程序可不用处理.Java异常类都必须继承Throwable类或其子类.用户通过继承自定义异常.常见异常:除数为零.负数开方.数组越界.I/O异常. 抛出的异常由catch捕获,未被捕获的异常逐层传播直到main.如果main也没有处理该异常,则操作系统会终止main执行. 处理异常时,也可以抛出新异常,也

java基础(十二章)

一.变量的作用域(有效的使用范围) 1.变量有2种 1.1成员变量(属性) 声明在类的里面,方法的外面 1.2 局部变量 声明在方法里面或for循环结构中 2.调用时的注意事项(初始值不同.作用域不同) 2.1 成员变量,有默认值 在当前类直接通过成员变量名调用:在其他类中,通过该类的对象名.属性(成员变量)名调用:成员变量名称在同一个类中是唯一的. 2.2 局部变量,没有默认值,必须先赋值再使用 局部变量,只能在当前的方法中使用,其他方法和其他类不能调用:在同一个方法中名称是唯一的,但多个方法

Java基础(十二)IO输入输出

一.IO 概述 1.IO 概念 IO:I 代表 Input 输入:O 代表 Output 输出. Java 中 IO 是以流为基础进行输入输出,所有的数据被串行化(保存)写入输出流,或者从输入流读入. 注:数据串行化指把对象的状态以特定的形式(比如 byte[])保存到流,通过流的方式写入. 2.IO 的作用 1.文本文件,通过特定方法能够把数据写到文件,也能够读取出文件中的内容. 2.把信息保存到磁盘文件中. 3.Java 操作文件 1.创建 File 对象方式 测试创建文件的三种方式: 1

Java基础语法&lt;十二&gt; 泛型程序设计

1 意义 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用. 常见应用 : ArrayList 2 K T V E ? object等的含义 类型变量使用大写形式 E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类)(需要时还可以用临近的字母U和S)表示任意类型  S.U.V – 2nd.3rd.4th types K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定的java类型(无限制通配

Scanner、String(java基础知识十二)

1.Scanner的概述和方法介绍 * A:Scanner的概述 * 是一个从键盘输入的类,有final修饰,不能被子类继承 * Scanner sc = new Scanner(System.in); * String str = sc.nextLine(); * B:Scanner的构造方法原理 * Scanner(InputStream source) * System类下有一个静态的字段: * public static final InputStream in; 标准的输入流,对应着键

java基础第十二篇之集合、增强for循环、迭代器和泛型

Collection接口中的常用方法: * 所有的子类子接口都是具有的 * 集合的方法:增删改查 * * public boolean add(E e);//添加元素 返回值表示是否添加成功 * public boolean remove(Object o);//删除元素,返回值表示是否删除成功 * 没有修改方法 * 查询元素的方法没有,但是 * public int size();//查询集合集合中元素的个数 * //其他方法: * public void clear();//清空集合 * p

JAVA基础(十二)抽象类与接口

抽象类 总结:                 类支持单继承.接口支持多继承                 类与类单继承,                 类实现接口,接口继承接口,先继承后实现 自己理解  抽象类:描述笼统的,模糊,不具体的具有共性的类  抽象类格式 Public abstract class 类名{ 成员变量 //方法 public abstract 返回值类型 方法名 (参数); Public abstract void get ();//抽象函数.需要abstract修

Java Script基础(十二) 正则表达式

Java Script基础(十二) 正则表达式 一.正则表达式中常用的符号 虽然可以使用string函数来完成验证,但是这种验证方式不够严谨,而且编写比较麻烦.而正则表达式是一种描述字符模式的对象,由一些特殊的符号组成,其组成的字母模式用来匹配各种表达式.下表中列举出常用的符号和用法. 正则表达式中常用的符号和用法 符号 描述  /....../  代表一个模式的开始和结束.  ^  匹配字符串的开始   $  匹配字符串的结束  \s  任何空白字符   \S  任何非空白字符   \d  匹

JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中,也是能看到他的,所以还是非常值得去学习的一个知识点的,我们直接开车了 一.Map概述 泛型< k,v> 键值对,映射关系 基本特点 该集合存储键值对,是一对一对往里存,而且要保证键的唯一性 1.添加 put(key ,values) putAll() 2.删除 clear() remove(ob

java基础知识(二)

1.关于static关键字总结: 1.不能在static修饰的方法中引用this变量,只能引用一些静态变量或方法,或new新的对象(可以定义局部变量). 简言之,静态方法或块中,只能引用静态的方法或变量. 2.类中的成员变量(static修饰)有缺省值,而类的定义的方法中的局部变量没有缺省值. 3.在类的构造器中,可以引用任何的静态或非静态的变量和方法,可以在非static方法中调用static方法. 4.static{}块中的代码在类装载中仅执行一次. 5.在7-7,A staticmetho