`

java中多线程的同步异步操作

阅读更多

程序在计算机运行为了提高效率便不能使用单一线程,所以多线程的出现解决了这个单线程效率低的问题,

在了解线程中,要先分清进程和线程。

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编程中一个关键的概念,特别是在设计高性能、高并发的应用时。多线程允许程序同时执行多个独立的任务,而异步性则是这些任务在不互相等待的情况下并行运行的能力,提高了系统的效率和响应速度...

    java多线程异步实例

    java线程异步案例,以三个线程作为案例典型,同时发起三个线程,根据不同的订单领取各自的物品,自作过程同步处理。

    Java多线程Executors批量执行数据实现限流

    Java多线程实现数据切割批量执行,实现限流操作。 java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。...

    同步异步多线程SOCKET通讯

    提供的"同步异步多线程SOCKET通讯.txt"文件可能包含实际的示例代码,展示了如何在Python、Java或C++等语言中实现同步和异步多线程Socket通信。这些代码可能包括创建Server端的Socket监听,创建并管理线程池,处理...

    汪文君JAVA多线程编程实战(完整不加密)

    书中详细介绍了Java多线程的核心概念,如线程的创建、启动、同步、协作以及生命周期管理。读者将学习如何通过实现Runnable接口或继承Thread类来创建线程,以及如何使用Executor框架来管理线程池。 此外,书中还深入...

    java基础多线程练习题(1)

    在Java编程语言中,多线程是核心特性之一,它使得程序可以同时执行多个不同的任务,从而提高了系统资源的利用率和程序的...在解决这些练习题的过程中,记得结合理论知识和实践操作,不断巩固和提高你的Java多线程技能。

    Java 模拟线程并发

    除了基本的线程创建,Java还提供了synchronized关键字用于线程同步,防止多个线程同时访问共享资源导致数据不一致。synchronized可以修饰方法或代码块,当一个线程正在执行synchronized代码时,其他线程必须等待。 ...

    java同步异步知识

    ### Java中的同步与异步详解 #### 一、同步与异步的概念理解 在软件开发领域,特别是针对并发处理和网络编程时,我们经常会遇到“同步”与“异步”这两个概念。简单来说: - **同步(Synchronous)**:指的是程序...

    JAVA 线程实现数据库的主从同步更新

    在Java编程环境中,...总之,使用Java线程实现数据库主从同步更新是一种常见且实用的技术手段,它涉及到多线程编程、数据库操作、事务管理等多个方面。理解和掌握这些知识点对于开发高可用性的分布式系统至关重要。

    java实现线程的异步

    Java 实现线程异步是程序设计中的一个重要概念,它涉及到多任务并行处理和非阻塞执行。在Java中,我们可以通过多种方式来实现线程的异步操作,以提高程序的执行效率和响应速度。 一、Java Thread 类 Java Thread 类...

    java 多线程数据库操作

    总之,Java多线程技术结合分页读取策略能有效提升数据库操作的效率,但同时也需要关注并发控制、资源管理以及异常处理等多个方面的细节,确保程序的稳定性和效率。在实际开发中,应根据项目需求和资源限制,选择合适...

    java多线程导出excel(千万级别)优化

    Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万级别的数据时。传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些...

    Java 多线程 PPT

    Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...

    多线程对文件读写操作(java)

    在Java编程中,多线程技术是提升程序执行效率的关键之一,特别是在进行文件读写操作时。本主题将深入探讨如何使用多线程来优化文件的读取和写入过程,以及需要注意的相关问题。 首先,我们需要理解单线程与多线程在...

    Java多线程技术精讲

    Java多线程技术是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。 ...

    java课程设计线程同步五子棋.zip

    在Java编程语言中,线程同步是一个关键概念,特别是在多线程编程中,它用于确保多个线程在访问共享资源时能正确协调,避免数据不一致性和竞态条件。五子棋游戏是一个典型的多线程应用场景,因为它涉及到两个玩家交替...

    java同步、异步相关知识点

    在Java编程语言中,同步(Synchronization)与异步(Asynchronization)是两个非常重要的概念,它们对于多线程处理和并发控制有着不可替代的作用。本文将深入探讨这两个概念的区别及其在Java中的具体应用。 #### 一...

Global site tag (gtag.js) - Google Analytics