JAVA学习---多线程

1.线程概述

2.线程实现(2种方式)

2.1通过Thread子类实现(Run方法、Start方法)

//继承Thread的方法开启多线程
public class Demo11_1 extends Thread{

    public void run() {   //线程运行的程序内容
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }

    public static void main(String[] args) {
        Demo11_1 d1 = new Demo11_1();
        d1.setName("线程1");
        d1.start(); //开启线程1

        Demo11_1 d2 = new Demo11_1();
        d2.setName("线程2");
        d2.start(); //开启线程2
    }
}

2.2通过Runnable接口实现(Thread(Runnable target))---方便实现线程共享

//通过Runnable的方法开启多线程
public class Demo11_1 implements Runnable{

    public void run() {   //线程运行的程序内容
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }

    public static void main(String[] args) {
        Demo11_1 r1 = new Demo11_1();
        Thread d1 = new Thread(r1);
        d1.setName("线程1");
        d1.start(); //开启线程1

        Demo11_1 r2 = new Demo11_1();
        Thread d2 = new Thread(r2);
        d2.setName("线程2");
        d2.start(); //开启线程2
    }
}

2.3 Thread和Runnable的区别

继承Thread类创建线程由于java的单重继承会受到一些限制,不能很好的实现数据共享,因此在实现数据共享时选用Runnable接口

3.线程的控制

3.1线程的生命周期

创建线程后需要通过start()方法启动线程,然后线程处于就绪状态,如果有多个线程同时执行,由于同一时间只能有一个线程就会出现堵塞状态。当线程处于堵塞状态后,就会处于暂时等待的情况,只有解除了等待后才会返回到就绪状态,直到线程运行结束或者使用interrupt()方法结束线程,线程才会进入到终止状态。

3.2线程的优先级

setPriority()设置线程优先级和getPriority()获得线程优先级

线程优先级是1-10之间整数或者三个枚举值

3.3线程的休眠与中断

sleep()指定线程休眠时间

interrupt()中止线程的执行

4.线程的同步与互斥

4.1线程安全问题与死锁

死锁的2种情况:相互排斥(一个线程永久独占资源而其他线程无法使用该资源一直处于等待状态的情况)和循环等待(相互等待形成循环等待)

避免死锁:有效控制每一线程的生命周期,确保同一时间只有一个线程访问同一资源

4.2线程同步(同步方法、同步代码块)

同步方法表示锁定方法只能同时被一个线程调用,其他线程必须处于等待状态,其调用变量必须使用private修饰,这样保证变量也被锁定。

//同步方法
synchronized void method(){

}

同步代码块可以锁定代码块中的内容,而不需要锁定整个方法。

//同步代码块
synchronized (object){

}

4.3线程间的通信(wait、notify)

线程间通信指线程之间可以通过等待和唤醒的方法相互通信,交替执行。

设置等待的方法是wait()方法,唤醒线程的方法是notify()方法,两者需要一同使用,如果有多个线程在等待,那么唤醒的是优先级高德线程。另外wait()方法可以指定等待的时间,在多线程程序中需要先唤醒其他线程后才可以将当前线程处于等待状态。

原文地址:https://www.cnblogs.com/zouhq/p/10543924.html

时间: 2024-11-02 23:11:42

JAVA学习---多线程的相关文章

Java学习---多线程的学习

基础知识 每个正在系统上运行的程序都是一个进程(process).每个进程包含一到多个线程(thread).进程也可能是整个程序或者是部分程序的动态执行. 线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务. Java对多线程的支持是非常强大的,他屏蔽掉了许多的技术细节,让我们可以轻松的开发多线程的应用程序.Java里面有2个方法实现多线程, 1 继承 Thread类,比如 class M

[Java学习]多线程(207待续)

关于多进程与多线程 使用多进程的目的:提高CPU利用率. 使用多线程的目的:提高应用程序?利用率. 多线程与多进程区别:进程间内存独立:同一个进程的线程间共享"堆内存和方法区内存",栈内存是独立的,一个线程一个栈. JVM原理 Java命令启动JVM虚拟机,等于启动了一个进程,该进程会自动启动一个主线程,然后主线程去调用某个类的main方法,所以main方法执行在主线程中. 单线程中,一个方法调用另一个方法,则这些方法按序压入栈中,此时JVM中只有一个栈. Java中多线程 publi

java学习——多线程

本文内容来源于  历经5年锤练--史上最适合初学者入门的Java基础视频 线程:就是进程中一个负责程序执行的控制单元(执行路径) 每一个线程都有自己运行的内容.这个内容可以称为线程要执行的任务. 多线程好处:解决了多部分同时运行的问题. 多线程的弊端:线程太多回到效率的降低. JVM启动时就启动了多个线程,至少有两个线程可以分析的出来. 1,执行main函数的线程, 该线程的任务代码都定义在main函数中. 2,负责垃圾回收的线程. 如何创建一个线程呢? 创建线程方式一:继承Thread类. 步

Java学习-多线程交互

1-生产者消费者问题 1. 使用栈来存放数据 1.1 把栈改造为支持线程安全 1.2 把栈的边界操作进行处理,当栈里的数据是0的时候,访问pull的线程就会等待. 当栈里的数据是200的时候,访问push的线程就会等待2. 提供一个生产者(Producer)线程类,生产随机大写字符压入到堆栈3. 提供一个消费者(Consumer)线程类,从堆栈中弹出字符并打印到控制台4. 提供一个测试类,使两个生产者和三个消费者线程同时运行 1 package multiplethread; 2 3 impor

Java 学习————多线程同步

public class Tongywo { public static void main(String[] args) { // TODO Auto-generated method stub Shangdian0 sd=new Shangdian0(100); Goumai0 no1=new Goumai0(70, sd, "No.1"); Goumai0 no2=new Goumai0(80, sd, "No.2"); no1.start(); no2.st

Java学习——多线程例子:李四王五

package cys; public class Example9_2 { public static void main(String[] args) { // TODO Auto-generated method stub People personal1,personal2; StringBuffer str=new StringBuffer(); personal1 = new People("李四",str); personal2 = new People("王五

Java学习——多线程例子:银行

package cys; public class Example9_3 { public static void main(String[] args) { // TODO Auto-generated method stub Bank bank = new Bank(); bank.setMoney(200); Thread thread1,thread2; thread1=new Thread(bank); thread1.setName("One"); thread2=new

Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍

1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过start方法启动线程--->线程变为可运行可执行状态,然后通过数据产生共享,线程产生互斥---->线程状态变为阻塞状态---->阻塞状态想打开的话可以调用notify方法. 这里Java5中提供了封装好的类,可以直接调用然后构造阻塞状态,以保证数据的原子性. 2.如何实现? 主要是实现Blo

Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger

本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是CountDownLatch? 倒计时计数器,调用CountDownLatch对象的CountDown()方法就将计数器减一,当计数到达0时,则所有等待者或者全部等待者开始执行. 2.如何用? new CountDownLatch(1); 直接new,其构造函数必须传一个int类型的参数,参数的意思是: c