Java基础-线程

/**
 * 程序是静态的数据 进程是动态的程序 线程是进程中的一个连续的控制流
 * 程序:Code+Data
 * 进程:程序+CPU
 * 线程:创建+就绪+运行+阻塞+销毁
 *
 * 2种生成线程类的方法
 * 继承:java.lang.Thread+对象.start();
 * 实现:java.lang.Runnable+借助Thread类对象.start();
 * 2种方式都要重写run()
 *
 * 常用方法
 * sleep(long time);
 * 主动休眠 yield();
 * 主动让出CPU join(); 立即进入执行状态
 * getName();setName();isAlive();currentThread();
 *
 * 线程的优先级:1-10 默认5 10最高
 *
 * 线程的同步 多个线程访问(操作)同一个资源,即发生了并发现象 为了确保共享资源合理有序的利用,而创建了同步机制
 * 实现同步:通过主要关键字synchronize和wait、notify等的配合
 * wait():让当前线程对象进入等待状态
 * notify():让当前线程对象发出一个唤醒信号,让等待者醒来
 *
 */
class Student extends Thread {
    private int score;

    @Override
    public synchronized void run() {
        try {
            System.out.println(this.getName() + "开始考试...");
            Thread.sleep(3000);
            System.out.println("考试结束,开始阅卷");
            Thread.sleep(3000);
            score = (int) (Math.random() * 101);
            System.out.println("阅卷结束,现在可以查询成绩了");
            this.notify();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public synchronized int getScore() {
        System.out.println(Thread.currentThread().getName() + "正在考试和阅卷,请稍等");
        try {
            this.wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return score;
    }
}

public class ThreadTest {

    public static void main(String[] args) {
        Student student = new Student();
        System.out.println("同学你考试能考多少分?");
        System.out.println("给我点时间,我去考试,看看");
        student.start();
        System.out.println("查询学生考试成绩:" + student.getScore());
    }

}
时间: 2024-10-24 07:30:52

Java基础-线程的相关文章

Java基础——线程总结

Java基础--线程总结 一.线程是什么? 线程:一个程序里不同的执行路径. 二.如何创建线程? 两种方法创建线程: 第一种 (1)定义具体功能类实现Runnable接口,可以多次调用而实现数据共享 (2)Thread myThread = new Thread(-)          //参数为Runnable接口类型 (3)Runnable中只有一个方法 public void run(){--} //用以定义线程运行体 第二种 (1)定义一个Thread的子类并重写run()方法 clas

java基础--线程并发

线程的使用方法: public static void main(String[] args) {     Runnable r = ()->{         while (true) {             System.out.println("this is thread");         }     };     Thread t = new Thread(r);     t.start();     while (true) {         System.

java基础——线程同步块

实现Runnable的线程同步块 package synchronization.block; /* @author zsben @create 2020-01-03 13:48 创建三个窗口卖票,使用Runnable接口方式 1.问题:卖票过程中出现了重票,错票-->出现了线程安全问题 2.解决方案:当一个线程在操作ticket时,其他线程不能参与进来(即使该线程被阻塞) 直到该线程操作完ticket,其他线程才可以参与进来, 3.java中通过同步机制进行解决 方式一:同步代码块 synch

java基础——线程通信机制,生产者消费者

package communication; /* 使用两个线程1,2交替打印1-100 线程通信方法: 1.wait():一旦执行此方法,当前线程进入阻塞态,并释放锁 2.notify():会唤醒被wait的一个线程,如果有多个线程wait,则唤醒优先级高的 3.notifyAll():唤醒所有被wait的线程 说明: 1.wait(),notify(),notifyAll()使用在同步代码块或同步方法中,不能用在lock方法中 2.这三个方法的调用者必须是同步代码块或同步方法中的锁对象(同步

java基础——线程池

package threadpool; /* 创建线程的方式四:使用线程池 1.提供指定线程数量的线程池 2.执行指定的线程的操作,需要实现Runnable接口或Callable接口实现类的对象 3.关闭连接池 好处: 1.提高响应速度,减少了创建线程的时间 2.降低资源消耗(重复利用线程池中线程,不需要每次都创建) 3.便于线程管理,设置线程池 @author zsben @create 2020-01-05 17:05 */ import java.util.concurrent.Execu

Java基础—线程

1.什么叫线程 进程:进行中的程序 线程:轻量级的进程:程序里的顺序控制流,可以理解为程序里不同的执行路径   线程体为run()方法(直接调用run()视为普通方法),启动线程为start()方法 2.线程的五种状态  创建:两种方式 继承Thread类,重写run()方法:实现Runnable接口,实现run()方法 就绪:调用Thread的start()方法(第二种实现接口方式使用静态代理) 运行:得到时间片,开始运行 阻塞:遇到阻塞事件 终止:线程死亡,严禁使用stop()方法,而应该定

不惑JAVA之JAVA基础 - 线程池

简单原理 一个比较简单的线程池至少应包含线程池管理器.工作线程.任务队列.任务接口等部分. 线程池管理器(ThreadPool Manager)的作用是创建.销毁并管理线程池,将工作线程放入线程池中: 工作线程是一个可以循环执行任务的线程,在没有任务时进行等待: 任务队列的作用是提供一种缓冲机制,将没有处理的任务放在任务队列中: 任务接口是每个任务必须实现的接口,主要用来规定任务的入口.任务执行完后的收尾工作.任务的执行状态等,工作线程通过该接口调度任务的执行. 线程池的优点 降低资源消耗,通过

JAVA基础——线程

1.单线程和多线程 单线程:.一个程序 只有一条线程(主线程main) 多线程:一个程序 除了一条主线程main 以外 还拥有很多的子线程 效率高 开销少 容易调度(启用)(CPU直接调度) 高并发性 2.线程和进程 线程:.程序运行中的一条执行路径,是组成进程(程序)的  一个进程 必须拥有一条线程(主线程(main)) 线程不能离开进程而独活 系统不为线程分配资源 多个线程共享进程的资源 进程:操作系统上运行的一个程度(可以简单的理解成一个程序) 进程是程序运行的基本单位(一个程序 必须拥有

java基础——线程安全的单例模式懒汉式

package savesingleton; /* 使用同步将单例模式中的懒汉式改写成线程安全的 @author zsben @create 2020-01-03 22:22 */ class Bank{ private Bank(){} private static Bank instance = null; /*public static synchronized Bank getInstance(){ if(instance == null){ instance = new Bank();