首页 > 编程语言 >Java线程基础

Java线程基础

时间:2023-02-17 09:55:59浏览次数:46  
标签:Java Thread 基础 死锁 线程 多线程 public

线程的创建

Java线程可以通过实现Runnable接口、Callable接口或继承Thread类进行创建。

实现Runnable接口实例

可以使用Runnable接口实现多线程,Runnable接口实现类必须实现run()方法,而且可以通过Thread类实例化,使用start()方法启动线程。例如:

public class MyRunnable implements Runnable{

    @Override
    public void run() {
        System.out.println("Thread running...");
    }

    public static void main(String[] args) {
        Thread t = new Thread(new MyRunnable());t.start();
    }
}

实现Callable接口实例

使用Callable接口可以实现多线程,Callable接口实现类必须实现call()方法,而且可以通过FutureTask类实例化,使用Thread类实例化,使用start()方法启动线程。例如:

public class MyCallable implements Callable {
    public Integer call() {
        System.out.println("Thread running...");
        return 1;
    }
    public static void main(String[] args) {
        FutureTask ft = new FutureTask<>(new MyCallable());
        Thread t = new Thread(ft);
        t.start();
    }
}

继承Thread类实例

使用Thread类可以实现多线程,实现类必须继承Thread类,并重写run()方法,通过start()方法启动线程。
例如:

public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Thread running...");
    }
    public static void main(String[] args) {
        Thread t = new MyThread();
        t.start();
    }
}

Java线程的同步

什么是线程同步?

线程同步是指多线程之间的协调,以便能够控制线程之间的访问,以便能够正确地执行操作。线程同步可以确保线程之间的数据不会被意外地改变,从而确保程序的正确性。

Java线程同步的实现

Java线程同步的实现主要依赖于Java的多线程技术,即使用Java多线程技术来控制多个线程之间的访问,以便能够正确地执行操作。Java多线程技术提供了一系列的方法来实现线程同步,其中包括synchronized关键字、wait()和notify()方法、Lock接口及其实现类等。

Java线程同步的方法

  • 使用synchronized关键字:synchronized关键字可以用来修饰方法或者代码块,使用synchronized关键字修饰的方法或者代码块在执行时,会自动获取当前对象的锁,这样在同一时刻,只有一个线程可以执行该段代码,其他线程需要等待该线程释放锁之后才能继续执行。

  • 使用wait()和notify()方法:wait()和notify()方法是Object类中定义的两个方法,使用这两个方法可以实现多线程之间的协调,当一个线程执行到wait()方法时,它会释放它所持有的锁,然后让出CPU,使得其他线程可以获取锁并继续执行;而notify()方法则是用来唤醒正在等待该对象锁的线程。

  • 使用Lock接口及其实现类:Lock接口及其实现类是Java并发包中提供的一种用于实现线程同步的方法,Lock接口提供了比synchronized关键字更多的功能,可以更灵活地控制线程之间的访问,从而更好地实现线程同步。

Java线程同步的实例

下面是一个使用synchronized关键字实现线程同步的例子:

public class MyThread extends Thread {
    private int count = 5;
    @Override
    public synchronized void run() {
        count--;
        System.out.println(Thread.currentThread().getName() + " count = " + count);
    }
}

上面的例子中,run()方法使用synchronized关键字进行了修饰,这样在多个线程同时调用run()方法的时候,只有一个线程可以执行run()方法,其他线程则需要等待当前线程执行完毕之后才能继续执行run()方法,从而实现了线程之间的同步。

Java线程的死锁

什么是死锁?

死锁是指程序中两个或多个任务相互等待对方释放已经占用的资源,从而导致程序无法正常运行的状态。在Java中,死锁是指两个或多个线程在等待彼此的资源,从而导致程序无法正常运行的状态。

死锁的原因及实例

死锁的原因主要有以下几点:

  • 互斥条件:一个资源每次只能被一个线程使用,即在一段时间内某个资源只能被一个线程占有
  • 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放
  • 不剥夺条件:线程已获得的资源,在未使用完之前,不能被其他线程强行剥夺
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

下面是一个死锁的示例:

假设现在有两个线程,ThreadA和ThreadB,ThreadA想要获取资源A和资源B,而ThreadB想要获取资源B和资源A,如果满足以下几点:

  • ThreadA先获取了资源A
  • ThreadB先获取了资源B
  • ThreadA再想获取资源B
  • ThreadB再想获取资源A

那么ThreadA和ThreadB将会进入死锁状态,因为它们各自占有一个资源,并且都在等待另一个资源,而它们都无法继续运行。

死锁的解决方法及实例

死锁的解决方法有以下几种:

  • 避免死锁:通过改变程序的设计,避免出现死锁情况,比如避免一个线程同时获取多个资源的情况
  • 检测死锁:检测出死锁的发生,并采取措施终止其中一个或者多个线程,以释放死锁产生的资源
  • 预防死锁:为了避免死锁,可以使用预防死锁算法,比如银行家算法

下面是一个使用预防死锁算法解决死锁的实例:

假设现在有两个线程,ThreadA和ThreadB,ThreadA想要获取资源A和资源B,而ThreadB想要获取资源B和资源A,我们可以使用预防死锁算法,让它们按照一定顺序获取资源,这样就可以避免死锁的发生。

Java线程的优先级

什么是线程优先级?

线程优先级是指系统操作系统在调度线程时所采用的一种策略,它决定了哪个线程先获得处理器的执行时间。操作系统会根据线程优先级的高低来调度线程,优先级越高的线程获得处理器资源的几率就越大,它被调度到CPU上执行的概率也就越大。

Java线程优先级的设置

Java线程优先级的设置可以使用Thread类中的setPriority()方法,该方法接收一个int类型的参数,参数值介于1~10之间,其中1表示最低优先级,10表示最高优先级,5是默认优先级。

Java线程优先级的实例

以下代码演示了如何设置线程优先级:

class ThreadPriority extends Thread {
	public void run() {
		stem.out.println("Thread Priority = " + this.getPriority());
	}
	public static void main(String[] args) {
		ThreadPriority t1 = new ThreadPriority();
		ThreadPriority t2 = new ThreadPriority();
		t1.setPriority(Thread.MIN_PRIORITY);
		t2.setPriority(Thread.MAX_PRIORITY);
		t1.start();
		t2.start();
	}
}
输出:

Thread Priority = 1
Thread Priority = 10

Java线程的安全性

什么是线程安全?

线程安全是指在多线程环境下,程序执行的结果不会因为线程并发执行而发生变化,它确保了多线程下程序的正确执行。

Java线程安全的实现

Java线程安全的实现主要有以下几种方法:

  • synchronized关键字:可以对某个类的某个方法或某个代码块加锁,使某段代码在同一时刻只能被一个线程执行;
  • volatile关键字:当多个线程访问某个类的时候,可以保证内存中该变量的值是同步的;
  • Atomic包:JUC(java.util.concurrent)原子操作类,可以实现原子操作;
  • Lock锁:可以替代synchronized关键字,它提供了比synchronized更多的功能,例如可以实现公平锁、超时锁等。

Java线程安全的方法

  • 使用同步机制:使用synchronized关键字、Lock锁、Atomic包等实现线程安全;
  • 使用不可变对象:使用不可变的对象可以避免多线程间的数据不一致问题;
  • 使用线程本地存储:使用ThreadLocal类可以为每个线程创建一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。

Java线程的性能

什么是线程性能?

线程性能是指线程在执行过程中的运行效率和执行速度,它反映了程序在多线程环境下的运行效果。

Java线程性能的优化

Java线程性能的优化主要有以下几种方法:

  • 避免线程上下文切换:尽量减少线程的创建和销毁,减少线程的上下文切换;
  • 避免线程等待:尽量减少线程之间的等待时间;
  • 使用线程池:可以有效减少线程的创建和销毁;
  • 尽量使用守护线程:可以减少程序的运行时间;
  • 使用并发集合:可以有效减少线程之间的竞争;
  • 使用并行流:可以有效提高程序的执行效率。

Java线程性能的实例

下面是一个简单的Java线程性能优化的实例:

public class ThreadPerformanceTest {
	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		for (int i = 0; i < 1000; i++) {
			new Thread(() -> {
			//处理逻辑
			}).start();
		}
		long endTime = System.currentTimeMillis();
		System.out.println("耗时:" + (endTime - startTime) + "ms");
	}
}

上面的示例中,我们使用了1000个线程来处理一些任务,执行这1000个线程需要耗费的时间可能会很长,所以我们可以使用线程池来优化程序的性能:

public class ThreadPerformanceTest {
	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		ExecutorService executorService = Executors.newFixedThreadPool(100);
		for (int i = 0; i < 1000; i++) {
			executorService.execute(() -> {
			//处理逻辑
			});
		}
		executorService.shutdown();
		long endTime = System.currentTimeMillis();
		System.out.println("耗时:" + (endTime - startTime) + "ms");
	}
}

使用线程池可以有效减少线程的创建和销毁,从而提高程序的性能。

什么是线程管理?

线程管理是指程序对线程进行管理,主要包括线程的创建、控制、同步和结束等操作。通过线程管理,可以让程序更有效地使用资源,提高程序的执行效率。

Java线程管理的实现

Java线程管理主要通过Java多线程API来实现,该API提供了线程的创建、控制、同步和结束等操作。

Java线程管理的方法

Java线程管理的方法主要有:

  1. 创建线程:通过Thread类的构造函数或者Runnable接口的实现类创建线程;

  2. 控制线程:通过Thread类的start()、stop()、suspend()、resume()等方法来控制线程;

  3. 同步线程:通过synchronized关键字、wait()、notify()等方法来同步线程;

  4. 结束线程:通过Thread类的interrupt()方法来结束线程。

Java线程的实践

Java线程的实践案例

Java线程的实践案例主要包括:

  1. 多线程同步:通过synchronized关键字、wait()、notify()等方法来实现线程同步;

  2. 生产者-消费者模型:通过生产者和消费者线程实现缓冲区的数据交换;

  3. 线程池:通过线程池来管理线程,提高程序的执行效率。

Java线程的实践技巧

  1. 使用线程池:通过线程池的使用可以有效地控制线程的数量,提高程序的执行效率;

  2. 合理使用同步:避免不必要的同步操作,可以提高程序的执行效率;

  3. 避免死锁:避免线程互相等待导致的死锁,可以提高程序的执行效率。

Java线程的实践总结

Java线程的实践可以提高程序的执行效率,但也要注意避免线程之间的死锁、不必要的同步操作等问题,以免影响程序的执行效率。

标签:Java,Thread,基础,死锁,线程,多线程,public
From: https://www.cnblogs.com/nedhome/p/17129101.html

相关文章

  • Java 文件上传
    一:配置springBoot上传文件限制spring:servlet:multipart:max-file-size:100MB#单个文件大小max-request-size:1024MB#总文件大小二:代码i......
  • Java语言常用哪些运算符?
    之前有个大家讨论过java的数据类型,总体来说类型和其他几种语言也相差无几,我为什么会这样说?我们应该都要知道Python可还有个复数类型。这里主要给大家讲解Java运算符的分类......
  • Java基础语法小结来啦
    简单的来说,一个java的程序他是有一系列对象的集合组成,通过对这些对象相互间调用的方式协同工作,下面就是我有关于Java基础语法的一些小结。一、return简单使用下面来一个J......
  • 读Java实战(第二版)笔记12_重构、测试和调试
    1. 设计模式1.1. 对设计经验的归纳总结1.2. 一种可重用的蓝图1.3. Java5引入了for-each循环1.3.1. 替代了很多显式使用迭代器的情形1.4. Java7推出的菱形操......
  • 安装Linux操作系统,学习Linux基础(必做)
    掌握了Linux命令的学习方法https://www.cnblogs.com/bky20221301/p/16652478.html......
  • Llvm 源码结构及测试基础
    Llvm源码结构及测试基础Llvm源码目录功能简介了解一下Llvm源码工程目录介绍、Llvm相关lib库的介绍、Llvm生成的工具链介绍,方便我们后期学习Llvm。LLVM源码工程目录介......
  • 代码随想录算法训练营第三十一天 | 贪心专题-理论基础,455.分发饼干,376. 摆动序列,53.
    一、参考资料理论基础https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html分发饼干https://programmerc......
  • hdfs操作——hdfs的shell命令和hdfs的JavaAPI操作
    hdfs解决hadoop海量数据的存储。shell命令(所有hadoopfs可由hdfsdfs代替)(1)在hdfs上创建目录hadoopfs-mkdir目录名(2)本地文件的上传hadoopfs-copyFromLoc......
  • JavaDoc生成文档
    参数信息:@author 作者名@version版本号@sinse指明需要最早使用的jdk版本@param参数名@return返回值情况@throws异常抛出情况 ......
  • 多线程对拍
    #include<bits/stdc++.h>usingnamespacestd;constintAllThrCnt=1e4,SinThrCnt=1;autosysrun(stringstr){ returnsystem(str.c_str());}enumjudgeinfo{J......