Java线程

简介: 版权声明:本文为博主原创文章,转载请注明出处。 https://blog.
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/53487378

Callable 可以返回值

ExecutorServers
ExecutorServers ser = ExevuteServers.newFixedThread()
Future result = sesr.submit(类);
ser.shutdownNow();
停止线程

线程类中定义线程体使用的标志
线程提内使用该标志
提供对外的方法改变该标识
外部调用方法改变标识

run (){
while(flag){
}
}

阻塞

join()合并线程

yeild()暂停当前正在执行的线程,执行其他线程static

sleep()暂停,不释放锁

–> 与时间相关

–> 模拟网络延时

system.currentTimeMillis()当前时间


//join 合并线程,执行当前线程时加入另一个线程,并等待另一个线程执行完毕

import java.util.Locale.Category;

public class Test1 {
    public static void main(String [] args) throws InterruptedException{
        home m = new home();

        Thread cat = new Thread(m); 
        cat.setName("cat");
        cat.start();

        for(int i = 0 ; i< 10; i++){
            cat.join();
            System.out.println("main");
        }
    }
}
class home implements Runnable{
    public void run() {
        for (int i = 0 ; i < 10 ; i++){
            System.out.println("This is "+Thread.currentThread().getName()+i);
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }
}

// yield 暂停本线程执行其他线程(虽然在我电脑上试没有任何反应。。。)
        for(int i = 0 ; i< 10; i++){
//          if(i%2==0)
            Thread.yield();
            System.out.println("main");
        }

优先级

*MAX_PRIOIRTY 10

NORM_PRIOIRTY 5

MIN_PRIOIRTY 1*

isAlive() 判断线程是否还活着
Thread.currentThread()当前线程 static
getName()

*setPriority()
优先级代表概率,不是绝对的先后顺序*

线程的同步与锁定

多个线程访问同一资源:线程安全

StringBuffer–append
hashtable
1.同步块/同步方法

同步方法:

package 线程;

import java.util.*;

import One.sss;

public class tongbu {
    public static void main(String [] args) throws InterruptedException{
        a m = new a();

        Thread cat = new Thread(m);
        Thread dog = new Thread(m);

        cat.setName("cat");
        dog.setName("dog");

        cat.start();
        dog.start();

    }
}

class a implements Runnable{
    int s =10;
    @Override
    public  void run() {
        // TODO Auto-generated method stub
            test1();
    }

    private synchronized void test1(){
        for (int i = 0 ; i < 10 ; i++){
            if (s<=0)
                break;
            System.out.println(Thread.currentThread().getName()+"get"+s--);
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

同步块:

synchronize(引用类型)

{ 同步的部分 }

//同步块,参数为引用`
private  void test2(){
    synchronized(this){
        for (int i = 0 ; i < 10 ; i++){
            if (s<=0)
                break;
            System.out.println(Thread.currentThread().getName()+"get"+s--);
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

锁定范围难把握

线程安全的效率相对低下

单例设计模式

一个类只有一个对象
双重检查
1、懒汉式:
将构造器设为私有。避免外部直接创建对象
声明私有的静态属性
对外部提供访问属性的静态方法,确保对象的存在
锁定静态的信息(XXX.class)

2、饿汉式
将构造器设为私有。避免外部直接创建对象
声明私有的静态属性,同时创建对象
对外部提供访问属性的静态方法
RunTime

//懒汉式
//可以满足要求但是效率不高
package 线程;

public class 单例 {
    public static void main(String[] args) throws InterruptedException {
        test s1 = new test();
        test s2 = new test();

        s1.start();
        s2.start();
    }
}

class Single {

    private static Single data = null;
    // 私有的构造函数
    private Single(){
    }

    //提供外界访问的函数
    public static synchronized Single getInstance() throws InterruptedException{
        if(null == data){
            Thread.sleep(1000);
            data = new Single();
        }
        return data;
    }
}

class test extends Thread{
    public void run(){
        try {
            System.out.println(Single.getInstance());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
//      System.out.println(b);
    }
}

//可以使用块同步
    public static Single getInstance2() throws InterruptedException{
        synchronized(Single.class){
            if(null == data){
                Thread.sleep(1000);
                data = new Single();
            }
            return data;
        }
    }

//双重检查
    public static Single getInstance3() throws InterruptedException {
        if (null == data) {
            synchronized (Single.class) {
                if (null == data) {
                    Thread.sleep(1000);
                    data = new Single();
                }
            }
        }
        return data;
    }

饿汉式

private static Single data = new Single();

声明时创建

过多的同步方法可能造成死锁
生产者消费者模式
wait()等待,释放锁
notify() 通知正在等待的线程-和同步一起使用
notifyAll() 通知多个线程

package 生产者消费者模式;

import javax.security.auth.login.FailedLoginException;

public class Moive {
    private String moive;
    boolean flag = true;

    public synchronized void play(String m){
        if (!flag){
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (flag){
            try {
                this.moive = m;
                Thread.sleep(500);
                System.out.println("已经放映电影:"+moive);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            flag = false;
            notify();
        }
    }

    public synchronized void watch() {
        if (flag){
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (!flag) {

            try {
                Thread.sleep(200);
                System.out.println("正在观看电影:" + moive);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            flag = true;
            notify();
        }
    }
}

Timer定时器

*一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。
*

schedule(TimerTask task, Date firstTime, long period)

安排指定的任务在指定的时间开始进行重复的固定延迟执行。

schedule(TimerTask task, Date time)

安排在指定的时间执行指定的任务。

schedule(TimerTask task, long delay)

安排在指定延迟后执行指定的任务。

::TimerTask(使用Runnable接口的方法)

相关文章
|
10天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
10天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第9天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将详细解析Java中的同步机制,包括synchronized关键字、Lock接口以及并发集合等,并探讨它们如何影响程序的性能。此外,我们还将讨论Java内存模型,以及它如何影响并发程序的行为。最后,我们将提供一些实用的并发编程技巧和最佳实践,帮助开发者编写出既线程安全又高效的Java程序。
22 3
|
10天前
|
算法 Java 开发者
Java中的多线程编程:概念、实现与性能优化
【4月更文挑战第9天】在Java编程中,多线程是一种强大的工具,它允许开发者创建并发执行的程序,提高系统的响应性和吞吐量。本文将深入探讨Java多线程的核心概念,包括线程的生命周期、线程同步机制以及线程池的使用。接着,我们将展示如何通过继承Thread类和实现Runnable接口来创建线程,并讨论各自的优缺点。此外,文章还将介绍高级主题,如死锁的预防、避免和检测,以及如何使用并发集合和原子变量来提高多线程程序的性能和安全性。最后,我们将提供一些实用的性能优化技巧,帮助开发者编写出更高效、更稳定的多线程应用程序。
|
8天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第11天】 在Java中,高效的并发编程是提升应用性能和响应能力的关键。本文将探讨Java并发的核心概念,包括线程安全、锁机制、线程池以及并发集合等,同时提供实用的编程技巧和最佳实践,帮助开发者在保证线程安全的前提下,优化程序性能。我们将通过分析常见的并发问题,如竞态条件、死锁,以及如何利用现代Java并发工具来避免这些问题,从而构建更加健壮和高效的多线程应用程序。
|
1天前
|
安全 Java
java多线程(一)(火车售票)
java多线程(一)(火车售票)
|
2天前
|
安全 Java 调度
Java并发编程:深入理解线程与锁
【4月更文挑战第18天】本文探讨了Java中的线程和锁机制,包括线程的创建(通过Thread类、Runnable接口或Callable/Future)及其生命周期。Java提供多种锁机制,如`synchronized`关键字、ReentrantLock和ReadWriteLock,以确保并发访问共享资源的安全。此外,文章还介绍了高级并发工具,如Semaphore(控制并发线程数)、CountDownLatch(线程间等待)和CyclicBarrier(同步多个线程)。掌握这些知识对于编写高效、正确的并发程序至关重要。
|
2天前
|
安全 Java 程序员
Java中的多线程并发编程实践
【4月更文挑战第18天】在现代软件开发中,为了提高程序性能和响应速度,经常需要利用多线程技术来实现并发执行。本文将深入探讨Java语言中的多线程机制,包括线程的创建、启动、同步以及线程池的使用等关键技术点。我们将通过具体代码实例,分析多线程编程的优势与挑战,并提出一系列优化策略来确保多线程环境下的程序稳定性和性能。
|
2天前
|
缓存 分布式计算 监控
Java并发编程:深入理解线程池
【4月更文挑战第17天】在Java并发编程中,线程池是一种非常重要的技术,它可以有效地管理和控制线程的执行,提高系统的性能和稳定性。本文将深入探讨Java线程池的工作原理,使用方法以及在实际开发中的应用场景,帮助读者更好地理解和使用Java线程池。
|
3天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
10 1
|
3天前
|
Java 开发者
Java中多线程并发控制的实现与优化
【4月更文挑战第17天】 在现代软件开发中,多线程编程已成为提升应用性能和响应能力的关键手段。特别是在Java语言中,由于其平台无关性和强大的运行时环境,多线程技术的应用尤为广泛。本文将深入探讨Java多线程的并发控制机制,包括基本的同步方法、死锁问题以及高级并发工具如java.util.concurrent包的使用。通过分析多线程环境下的竞态条件、资源争夺和线程协调问题,我们提出了一系列实现和优化策略,旨在帮助开发者构建更加健壮、高效的多线程应用。
3 0