java基础--线程并发

  1. 线程的使用方法:
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.out.println("this is main");
    }
}

步骤:实现Runnable接口的run方法,创建一个线程,执行start方法。不要调用run方法,这个方法只会执行一个线程中的任务,不会创建新线程。

2.中断线程

    Runnable r = ()->{
        int i=0;
        while(!Thread.currentThread().isInterrupted()) {        //判断当前线程是否被终止
            System.out.println("this is thread");
            i++;
            if (i==100){
                Thread.currentThread().interrupt();     //获取当前线程并向其发送中断请求,线程的中断状态将被设置为true
            }
        }
};

3.线程状态

1)join()等待终止指定的线程

2)getState()得到这一线程的状态

4.线程属性

1)每个线程都有一个优先级,默认情况下一个线程继承它的父线程的优先级。

2)优先级最低为1,最高为10,默认为5,可以通过thread.setPriority()来设置优先级。

3)thread.setDaemon(true)将线程转换为守护进程,当只剩下守护进程时,虚拟机就退出了。守护进程应该永远不去访问固有资源,如文件、数据库等。

4)run方法不能抛出任何受查异常,但是非受查异常会导致进程终止。线程死亡时,异常被传到一个用于未捕获异常的处理器。

5.同步

1)锁对象:解锁语句必须放在finally中,而且不能使用带资源的try语句。

private int Acount=10000;
public Lock lock = new ReentrantLock();

public void addcount(){
    lock.lock();
    try {

        Acount += 1000;
        System.out.println(meg+"加 Account is :"+Acount);
    }
    finally {
        lock.unlock();
    }

}

2)条件对象(条件变量)

一个锁可以有一个或者多个相关的条件对象,newCondition方法获取一个条件对象,调用await()方法使当前线程被阻塞,并放弃锁,将该线程放到条件的等待集中。对于await()的调用应该在while循环里,这样另外一个线程就能进来了。

signalAll()解除了该条件的等待集中的所有线程的阻塞状态。

3)synchronized

java中每个对象都有一个内部锁,并且该锁有一个内部条件,如果一个方法用synchronized声明,那么对象的锁将保护整个方法。使用wait、notifyAll、notify。

将静态方法声明为synchronized也是合法的,该方法会获得相关类的内部锁,没有其他线程可以调用同一个类的这个或任何其他的同步静态方法。

4)锁

tryLock() 尝试获得锁而不会发生阻塞,如果成功则返回真。

ReentrantReadWriteLock rwl = new ReentrantReadWriteLock() 构造一个读写锁对象

Lock readlock = rwl.readLock()        获取读锁

Lock writeLock = rwl.writeLock();      获取写锁

6.执行器

如果程序中创建大量的生命期很短的线程,应该使用线程池,一个线程池包含了许多准备运行的空闲线程,将Runnable对象交给线程池,就会有一个线程调用run方法,当run方法退出时,线程不会死亡,而是在池中准备为下一个请求提供服务。

执行器(Executor)类有许多静态工厂方法来构建线程池。

ExecutorService pool = Executors.newCachedThreadPool();//返回带缓存的线程池
ExecutorService pool = Executors.newFixedThreadPool(10);//指定线程数
ExecutorService pool = Executors.newSingleThreadExecutor();//单个线程依次执行
Task task = new Task(1,pool);
Future<?> res = pool.submit(task);            //执行任务
pool.shutdown();                              //关闭服务
时间: 2024-10-19 03:26:18

java基础--线程并发的相关文章

Java基础】并发 - 多线程

Java基础]并发 - 多线程 分类: Java2014-05-03 23:56 275人阅读 评论(0) 收藏 举报 Java 目录(?)[+] 介绍 Java多线程 多线程任务执行 大多数并发应用程序时围绕执行任务(task)进行管理的:所谓任务就是抽象的,离散的工作单元. 围绕执行任务来管理应用程序时,第一步是要指明一个清晰的任务边界.大多数应用服务器程序都选择了下面这个自然的任务辩解:单独的客户请求: 任务时逻辑上的单元: 任务 Runnable 表示一个任务单元(java.lang)

Java基础——线程总结

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

【Java】线程并发拷贝程序

据说大连某211高校的信息学院的李教授非常好这口,他带的每个操作系统本科班,每个学期都必须完成这个程序,不过网上关于这方面的资料甚少,就只有一份C语言版. 然而,那份被历届学生已经抄烂,改实验结果把李教授忽悠了N年的C语言版,所使用的类.所开的线程与进程也不甚合理,把一个本来非常简单的程序搞得十分冗长.明明这个线程并发拷贝程序只涉及到线程的互斥的方面,与线程的同步半点关系,这个线程并发拷贝程序的互斥,也就是每个线程操作的文件只能是一个,保证不出现一个文件被多个文件操作的情况即可,做完拷贝之后根本

【Java】线程并发、互斥与同步

网络上对于线程的解析总是天花龙凤的,给你灌输一大堆概念,考研.本科的操作系统必修课尤甚,让你就算仔细看完一大堆文章都不知道干什么. 下面不取网站复制粘贴,在讲解自己的Java线程并发.互斥与同步之前先给大家解构操作系统书中那些给出书者为了出书者而写的废话到底是什么意思. 大神们如果只想看程序,可以自行跳过,反正我的文章从来新手向,不喜勿看. 一.线程的基本概念 其实线程的概念非常简单,多一个线程,就多了一个做事情的人. 比如搬东西,搬10箱货物,这就是所谓的一个进程,一个人,就是所谓的一个线程,

Java基础-线程

/** * 程序是静态的数据 进程是动态的程序 线程是进程中的一个连续的控制流 * 程序:Code+Data * 进程:程序+CPU * 线程:创建+就绪+运行+阻塞+销毁 * * 2种生成线程类的方法 * 继承:java.lang.Thread+对象.start(); * 实现:java.lang.Runnable+借助Thread类对象.start(); * 2种方式都要重写run() * * 常用方法 * sleep(long time); * 主动休眠 yield(); * 主动让出CP

11.9-全栈Java笔记: 线程并发协作(生产者/消费者模式)

多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型"生产者消费者模式". 什么是生产者? 生产者指的是负责生产数据的模块(这里模块可能是:方法.对象.线程.进程). 什么是消费者? 消费者指的是负责处理数据的模块(这里模块可能是:方法.对象.线程.进程). 什么是缓冲区? 消费者不能直接使用生产者的数据,它们之间有个"缓冲区".生产者将生产好的数据放入"缓冲区",消费者从"缓冲区"

JAVA基础——线程

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

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.这三个方法的调用者必须是同步代码块或同步方法中的锁对象(同步