`

Java之线程基础与并发同步

阅读更多
1、实现线程

第一步:实现方法体

两种方法:

1)继承 java.lang.Thread 类,重写其 run() 方法。
   不推荐使用该方法,因为只能继承一个类,就不能继承其它的类了。

2)实现 java.lang.Runnable 接口,实现其 run() 方法。
   接口可以实现多个。
   其实 Thread 类也是实现了 java.lang.Runnable 接口。


第二步:运行

new 一个 java.lang.Thread 类,并调用其 start() 方法


说明:
在 jdk 1.5 中可以使用 java.util.concurrent 包中的类进行线程操作。
请阅读 java.util.concurrent包之Execuotor系列文章



2、例子:


例子一:


/*
         设计2个线程
         其中:
          1. 一个线程对数值增加 1
          2. 一个线程对数值减少 1
          3. 每个线程最多累计增加或减少9次
 */
public class TestSyncThread {
     
    public static void main(String[] args){
       
       int initNumber = 10;        
       Counter c = new Counter(initNumber);
       
       Thread t1 = new IncThread(c);
       Thread t2 = new Thread(new DecInterface(c));
       t1.start();
       t2.start();
    
    }
}

class Counter{
    private static int num = 0;
    public static int max = 100;
    
    public Counter (int init){
        num = init;
    }
    
    
    public synchronized void inc(int i){
        num ++;
        System.out.print("inc: ");
        System.out.println(num);
        
        if(i%10 == 9){
            this.notify();
            try {
                this.wait();                
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        if(i==max){
            this.notify();
        }
        
    }
    
    public synchronized void dec(int i){
        num --;
        System.out.print("dec: ");
        System.out.println(num);
        
        if(i%10 == 9){
            this.notify();
            try {
                this.wait(); 
                
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        if(i == max){
            this.notify();
        }
    }
      
}
/*

    1、线程类中不要有 synchronized, wait(), notify() 等。这些是针对对象的。写在对象中。
    2、wait(), notify(), notifyAll() 方法需要放在 synchronized 修饰的方法体内,
             否则会提示:java.lang.IllegalMonitorStateException 
                           异常:该线程没有锁定对象却释放对象的锁。
             而线程执行 synchronized 修饰的语句块时,会拥有这个对象的锁。
    3、如果出现 java.lang.IllegalMonitorStateException:
       换句话说就是该线程未获得该对象监视器(即锁),而去调用 wait(), notify() 等操作。
*/
class IncThread extends Thread{
    Counter c;
    public IncThread( Counter c){
        this.c = c;
    }
    @Override
    public void run() {
        for(int i=0;i<=Counter.max;i++){
            System.out.print("i: "+i+ " - ");
            c.inc(i);
        }
    }
}


class DecInterface implements Runnable{    
    Counter c;    
    public DecInterface( Counter c){
        this.c = c;
    }    
    @Override
    public void run() {
        for(int i=0; i<=Counter.max; i++){
            System.out.print("i: "+i+ " - ");
            c.dec(i);            
        }        
    }
}






例子二:

尚学堂马士兵老师的:生产者消费者(注意英文注释的内容)


public class ProduceConsumer{  
    public static void main(String[] args){  
        SyncStack ss = new SyncStack();  
        Producer pro = new Producer(ss);  
        Consumer con = new Consumer(ss);  
        new Thread(pro).start();  
        new Thread(con).start();  
          
    }     
}  
  
class Product{  
    int id;  
    public Product(int id){  
        this.id = id;  
    }     
    public String toString(){  
        return "Product:" + id;  
    }  
}  
  
class SyncStack{  
    int index  = 0;  
    Product[] arrPro = new Product[6];  
      
    public synchronized void push(Product p){
        
        while (index == arrPro.length){  
            try {  
                this.wait();  // Causes the current thread to wait.
                /*                   
                   The current thread must own this object's monitor(lock),
                   then the thread releases ownership of this monitor(lock) 
                   and waits until another thread notifies threads which waiting on 
                   this object's monitor to wake up, either through a call to the notify() method 
                   or the notifyAll() method. 
                   The thread waits until it can re-obtain ownership of the monitor and resumes execution. 
                   
                 */
            } catch (InterruptedException e) {
                e.printStackTrace();  
            }  
        } 
        
        arrPro[index] = p;  
        index++;
       
        this.notify(); // send notification to threads to wake up for this object.
        /*
        Wakes up a single thread that is waiting on this object's monitor.
        
        If any threads are waiting on this object, one of them is chosen to be awakened. 
        The choice is arbitrary and occurs at the discretion of the implementation. 
        
        [NOTE: A thread waits on an object's monitor by calling one of the wait() methods.] 

        The awakened thread will not be able to proceed until the current thread 
        relinquishes(quit) the lock on this object. (
            so the "notify()" method can be put on the top of this method, it works fine.
        ).
        The awakened thread will compete in the usual manner with any other threads 
        that might be actively competing to synchronize on this object; 
        for example, the awakened thread enjoys no reliable privilege or disadvantage 
        in being the next thread to lock this object. 

        This method should only be called by a thread that is the owner of this object's monitor.         
        A thread becomes the owner of the object's monitor in one of three ways(
            Only one thread at a time can own an object's monitor.
        ): 
        
            1. By executing a synchronized instance method of that object. 
            2. By executing a synchronized statement body that synchronizes on the object. 
            3. By executing a synchronized static method of that class (for objects of type Class). 
      
     */
    }  
      
    public synchronized Product pop(){
        this.notify();
        while (index == 0){
            try {  
                this.wait();  
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        index--;  
        return arrPro[index];  
    }  
      
}  
  
class Producer implements Runnable{  
    SyncStack ss = null;  
    public Producer(SyncStack ss){ //持有SyncStack的一个引用  
        this.ss = ss;  
    }  
    @Override  
    public void run() {  
        for(int i=0; i<20; i++){  
            Product p = new Product(i);  
            ss.push(p);  
System.out.println("生产了:" + p);  
            try {  
                Thread.sleep(100);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
          
        }  
          
    }     
}  
  
class Consumer implements Runnable{  
  
    SyncStack ss = null;  
    public Consumer(SyncStack ss){ //持有SyncStack的一个引用  
        this.ss = ss;  
    }  
    @Override  
    public void run() {  
        for(int i=0; i<20; i++){  
            Product p = ss.pop();  
System.out.println("消费了:" + p);  
            try {  
                Thread.sleep(500);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
          
        }  
          
    }     
}  































-

分享到:
评论

相关推荐

    Java 模拟线程并发

    总之,Java模拟线程并发是一个广泛且深入的话题,涵盖了线程的创建、同步、管理和高级并发工具的使用。理解和熟练应用这些知识,能够帮助开发者编写出高效、安全的多线程程序。在实际开发中,应根据具体需求选择合适...

    java 多线程并发实例

    在Java编程中,多线程并发是...总之,Java的多线程并发实例可以帮助我们更好地理解和实践线程控制、同步机制以及经典的设计模式,提升我们的编程能力。通过不断学习和实践,我们可以编写出高效、安全的多线程并发程序。

    Java_多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...

    java线程与并发编程实践

    Java线程与并发编程实践是Java开发者必备的技能之一,特别是在多核处理器和高并发应用环境中,有效地管理和利用线程能极大地提升程序的性能。本书《java线程与并发实践编程》由Jeff Friesen撰写,2017年2月出版,...

    黑马程序员_张孝祥_Java多线程与并发库 视频+代码+资料

    4. **线程同步与死锁**:当多个线程访问共享资源时,为了避免数据不一致问题,需要使用同步机制。但同步不当可能会导致死锁,这是多个线程互相等待对方释放锁的情况。 5. **线程通信**:线程间的通信主要通过共享...

    Java多线程与并发库高级应用视频教程22集

    资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程...

    java多线程并发

    在现代软件开发中,特别是在Java这样的主流编程语言中,多线程并发技术是提高程序执行效率、优化资源利用的关键手段之一。本篇文章将深入探讨Java中的多线程并发机制,并通过具体的示例来帮助读者更好地理解和掌握这...

    JAVA多线程并发编程

    但同时,多线程并发也会引入一些问题,如数据竞争和同步问题。 为了解决这些问题,Java提供了多种同步机制。`synchronized`关键字用于控制对共享资源的访问,确保同一时间只有一个线程可以执行特定代码块,从而避免...

    java多线程与并发1

    Java多线程与并发是Java开发中的重要领域,尤其在现代高性能应用中,对多核处理器的充分利用和高效系统设计离不开并发技术。本主题主要基于《Java多线程编程核心技术》和《Java+7并发编程实战手册》两本书籍的核心...

    java多线程和并发.pdf

    Java多线程与并发编程是Java语言中用于处理多任务执行的关键技术,它能够帮助开发者设计出能够有效应对高并发请求的应用程序。在现代的线上(Online)和离线(Offline)应用中,合理利用多线程技术可以大幅提高系统...

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

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

    JAVA实现线程间同步与互斥生产者消费者问题

    本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...

    java 多线程高并发相关资料收集

    在Java编程领域,多线程和高并发是两个至关重要的概念,它们对于构建高效、可扩展的系统至关重要。本文将围绕“Java多线程高并发相关资料收集”这一主题,详细探讨这两个领域的核心知识点。 首先,多线程是指在单个...

    java多线程之并发锁

    Java 多线程之并发锁 Java 中的多线程编程是指在一个程序中同时运行多个线程,以提高程序的执行效率和响应速度。在多线程编程中,线程间的同步是非常重要的,因为不同的线程可能会同时访问同一个共享资源,导致数据...

    java多线程并发实战和源码

    Java多线程并发实战与源码分析是Java开发中至关重要的一部分,它涉及到程序性能优化、系统资源高效利用以及复杂逻辑的正确同步。本书主要聚焦于Java多线程的基础理论和实际应用,虽然书中实例和源码相对较少,但仍然...

    Java 多线程与并发(2-26)Java 并发 - 线程基础.pdf

    线程基础是理解并发编程的关键,它涉及到线程的状态转换、创建与使用方式、同步与协作机制等方面。 线程有五种基本状态: 1. 新建(New):线程被创建但尚未启动。 2. 可运行(Runnable):线程可能正在运行,也...

    Java 多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中不可或缺的一部分,它涉及到如何高效地利用CPU资源,实现并发执行多个任务。在操作系统层面,多线程是为了提高系统利用率,使得多个任务能够"同时"执行,但实际上,由于CPU的时钟...

    Java多线程与并发库高级应用

    在深入探讨Java多线程与并发库的高级应用之前,我们首先需要回顾一下Java多线程的基础概念和技术要点。 ##### 1.1 线程的概念 在计算机科学中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是...

    多线程,高并发.zip

    创建Java线程有两种主要方法:通过实现`Runnable`接口或继承`Thread`类。`Runnable`通常更灵活,因为它允许线程与其他对象共享数据,而不会遇到单继承的限制。 高并发则涉及系统能够同时处理大量请求的能力。在...

Global site tag (gtag.js) - Google Analytics