程序在计算机运行为了提高效率便不能使用单一线程,所以多线程的出现解决了这个单线程效率低的问题,
在了解线程中,要先分清进程和线程。
1:一个程序有可以是有多个进程来运行的,每个进程有自己独立的内存空间去运行操作数据。
2:线程是处于进程中的更小执行单位,每个进程中有多个线程,每个线程有独立的内存空间去操作对象中的变量,又共同享有,同一块内存空间存放共同处理的对象。
由大到小的顺序是:程序>进程>线程
正常默认创建的线程是异步线程,线程还有一种是同步线程
异步线程:多个线程可以同时对一个对象进行操作。
同步线程:线程不能同时对一个对象进行操作。
有三种能创建线程的方式:(以下3种例子的线程都为异步线程)
方法1:将所需要的类去继承Thread类,Thread类是在java的lang包中。继承Thread,重写run的方法,在主类main中去创建线程对象,并调用Thread中的start 方法。 代码如下:
public class Demo{ public static void main(String [] args){ //创建一个ThreadTest 线程 t1 ThreadTest t1 = new ThreadTest(10,"线程A"); // t调用方法start() 通知cpu调用run方法执行 t1.start(); //创建一个ThreadTest 线程 t2 ThreadTest t2 = new ThreadTest(10,"线程B"); t2.start(); } //继承Thread 的ThreadTest类 static class ThreadTest extends Thread{ //定义一个变量num,线程名字name; int num; String name; //重写构造方法传入参数num,name public ThreadTest(int num,String name) { super(); this.num = num; this.name = name; } //重写run方法 public void run(){ //重写的方法run中调用Test方法 Test(); } public void Test(){ for(int i = 0;i<20;i++){ System.out.println(name+"<>"+num++); } } } }
方法2:实现接口runnable也可以创建线程,runnable中不能直接用Thread的方法,所以需要创建一个Thread对象来包装由实现runnable接口的线程创建的对象,再用包装好的Thread对象来调用Thread中的 start方法。 代码如下:
public class Demo1 { /** * @param args */ public static void main(String[] args) { //创建RunnableTest类的第一个线程t1 RunnableTest r1 = new RunnableTest(10,"线程A"); //用Thread包装r1对象 Thread t1 = new Thread(r1); t1.start(); //创建RunnableTest类的第二个线程t2 RunnableTest r2 = new RunnableTest(10,"线程B"); //用Thread包装r1对象 Thread t2 = new Thread(r2); t2.start(); } static class RunnableTest implements Runnable{ int num; String name; //重载构造函数 public RunnableTest(int num,String name){ this.name = name; this.num = num; } @Override //重写run方法 public void run() { //调用 Test()方法 Test(); } public void Test(){ for(int i = 0;i<20;i++){ System.out.println(name+"执行了 "+num++); } } } }
方法3:在java的util包中有timer和timertast类,实现timertast类,也可以创建线程,timertast是定时器类
代码如下:
import java.util.Timer; import java.util.TimerTask; public class Demo2 { /** * @param args */ public static void main(String[] args) { //创建一个Timertest对象 Timertest t = new Timertest(10,"线程A"); //用Timer创建定时器对象t1 Timer T = new Timer(); //用定时器对象调用方法, T.schedule(t, 100); //创建一个Timertest对象 Timertest t1 = new Timertest(10,"线程B"); //用Timer创建定时器对象T1 Timer T1 = new Timer(); //用定时器对象调用方法, T1.schedule(t1, 100); } static class Timertest extends TimerTask{ int num; String name; public Timertest(int num,String name){ this.name = name; this.num = num; } @Override //重写run方法 public void run() { Test(); } public void Test(){ for(int i = 0;i<20;i++){ System.out.println(name+"执行了 "+num++); } } } }
上面3种方法都可以创建线程,(例子中的一些方法未注释,自己查API文档,在什么包中都有注明)。
在异步线程中,继承Thread后中有许多方法时比较常用的。
例如:Thread.currentThread() 获得当前线程对象
Thread.sleep(毫秒) 当前线程休眠指定的毫秒数
setPriority(1~10); 设置线程的优先级 (1~10,数字越大,优先级越高,默认为5)
getPriority(); 获得线程的优先级
join() 等待该线程执行完毕(也称合并线程,单线程,指等一个线程执行结束后,再执行 另一个线程)
yield() 暂停当前正在执行的线程对象,并执行其他线程(当前线程让出执行的时间片段,由下一个线程使用。也有可能下个线程还是自己,所以不是绝对)。
getState() 获得线程的状态
isAlive() 是不是活动的线程(不常用)
start() 启动线程的方法(常用)(只是给虚拟机一个信号,当前这个线程可以执行run方法了 线程的run 方法什么时候开始执行,是由CPU调度的)
线程中存在五种状态:
新建状态:处于创建状态,未调用start()方法。
runnable:就绪状态,调用start()方法,等待CPU调度。
running :cpu调度后,处于运行状态。
not running:处于阻塞状态下,暂停状态(可能由于方法join()或者yield()而导致的状态)。
dead:线程执行结束时的死亡状态。
在同步线程中不可以对同一个对象进行操作,所以当一个线程在操作时,另一个线程必须等到前一个线程执行结束才可以接着执行,有4种方法可以实现线程的同步。
方法一:synchronized
方式一:使用synchronized(对象) 锁住需要同步的代码块
方法二:使用synchronized锁住需要同步的方法
方法三:从jdk1.5开始提供的对象锁
Lock l = new ReentrantLock();
//上锁
l.lock();
//解锁
l.unlock();
方法四:使用wait-notify机制
线程在现在的B/S主流情况下时非常实用的,一个网页是要同时支持多人浏览的,所以在多线程情况下,一(网页)对多(用户)的情况就可以解决。
相关推荐
总之,Java多线程和异步调用是构建高效、响应迅速的应用程序的关键技术。通过合理利用这些工具和机制,开发者可以编写出能够充分利用多核处理器优势的代码,从而提高软件性能。在实际应用中,理解并熟练掌握这些概念...
综上所述,"java多线程查询数据库"是一个涉及多线程技术、线程池管理、并发控制、分页查询等多个方面的复杂问题。通过理解和掌握这些知识点,我们可以有效地提高数据库操作的效率和系统的响应速度。
Java多线程异步性是Java编程中一个关键的概念,特别是在设计高性能、高并发的应用时。多线程允许程序同时执行多个独立的任务,而异步性则是这些任务在不互相等待的情况下并行运行的能力,提高了系统的效率和响应速度...
java线程异步案例,以三个线程作为案例典型,同时发起三个线程,根据不同的订单领取各自的物品,自作过程同步处理。
Java多线程实现数据切割批量执行,实现限流操作。 java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。...
提供的"同步异步多线程SOCKET通讯.txt"文件可能包含实际的示例代码,展示了如何在Python、Java或C++等语言中实现同步和异步多线程Socket通信。这些代码可能包括创建Server端的Socket监听,创建并管理线程池,处理...
书中详细介绍了Java多线程的核心概念,如线程的创建、启动、同步、协作以及生命周期管理。读者将学习如何通过实现Runnable接口或继承Thread类来创建线程,以及如何使用Executor框架来管理线程池。 此外,书中还深入...
在Java编程语言中,多线程是核心特性之一,它使得程序可以同时执行多个不同的任务,从而提高了系统资源的利用率和程序的...在解决这些练习题的过程中,记得结合理论知识和实践操作,不断巩固和提高你的Java多线程技能。
除了基本的线程创建,Java还提供了synchronized关键字用于线程同步,防止多个线程同时访问共享资源导致数据不一致。synchronized可以修饰方法或代码块,当一个线程正在执行synchronized代码时,其他线程必须等待。 ...
### Java中的同步与异步详解 #### 一、同步与异步的概念理解 在软件开发领域,特别是针对并发处理和网络编程时,我们经常会遇到“同步”与“异步”这两个概念。简单来说: - **同步(Synchronous)**:指的是程序...
在Java编程环境中,...总之,使用Java线程实现数据库主从同步更新是一种常见且实用的技术手段,它涉及到多线程编程、数据库操作、事务管理等多个方面。理解和掌握这些知识点对于开发高可用性的分布式系统至关重要。
Java 实现线程异步是程序设计中的一个重要概念,它涉及到多任务并行处理和非阻塞执行。在Java中,我们可以通过多种方式来实现线程的异步操作,以提高程序的执行效率和响应速度。 一、Java Thread 类 Java Thread 类...
总之,Java多线程技术结合分页读取策略能有效提升数据库操作的效率,但同时也需要关注并发控制、资源管理以及异常处理等多个方面的细节,确保程序的稳定性和效率。在实际开发中,应根据项目需求和资源限制,选择合适...
Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万级别的数据时。传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些...
Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与...
Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...
在Java编程中,多线程技术是提升程序执行效率的关键之一,特别是在进行文件读写操作时。本主题将深入探讨如何使用多线程来优化文件的读取和写入过程,以及需要注意的相关问题。 首先,我们需要理解单线程与多线程在...
Java多线程技术是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。 ...
在Java编程语言中,线程同步是一个关键概念,特别是在多线程编程中,它用于确保多个线程在访问共享资源时能正确协调,避免数据不一致性和竞态条件。五子棋游戏是一个典型的多线程应用场景,因为它涉及到两个玩家交替...
在Java编程语言中,同步(Synchronization)与异步(Asynchronization)是两个非常重要的概念,它们对于多线程处理和并发控制有着不可替代的作用。本文将深入探讨这两个概念的区别及其在Java中的具体应用。 #### 一...