java多线程(包含生产者与消费者例子)

java多线程
1.任务的run()方法通常总会有某种形式的循环,使得任务一直运行下去直到不再需要,所以要设定跳出循环的条件。通常,它被写成无限循环的形式这就意味着,除非有个条件使用它终止,否则它将永远运行下去。
2.使用Executor:
    java.util.consurrent包中的执行器将为你管理Thread对象,从而简化了并发编程。如:
        ExecutorService exec = Executors.newCachedThreadPool();
        //..= Executors.newFIxedThreadPool(5)是有数量限制的线程集
        //..=Executors.newSingleThreadExecutor()是顺序执行的线程集
        exec.execute(...);
        exec.shutdown();
3.几种方法:
    1.sleep():休眠一段时间
    2.yield():报告自己重要的工作已经完成,可以休息一段时间,让CPU执行其它线程。但是这里不保证会不执行这个线程而去执行其它线程,它只是将本线程的优先级降低来建议运行其它线程。
    3.wait():
    4.join():如在B的run()当中运行A.join():表明B要在A执行完毕或者被中断之后才能继续进行。

4.volatile关键字:
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。


5.守护线程:
    守护线程在没有用户线程可服务时自动离开, 在Java中比较特殊的线程是被称为守护(Daemon)线程的低级别线程。这个线程具有最低的优先级,用于为系统中的其它对象和线程提供服务。将一个用 户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon方法。典型的守护线程例子是JVM中的系统资源自动回收线程,我们所熟 悉的Java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以 当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。 它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性 地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。那Java的守护线程是什么样子的呢。当 JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则JVM不会退出。

6.捕获异常
    由于线程的本质我,使得不能捕获从线程中逃逸的异常。一旦异常逃出任务的run()方法,它就公向外传播到控制台,除非你采取特殊的步骤捕获这种错误的异 常。以前可以用线程组来完成这一工作,但是现在可以用Executor来解决这个问题,因此不再需要了解有关线程组的任何知识了。

  • join()方法的使用:
public class A{
    public void run(){
       try{
         sleep(1500);
       }catch(InterruptedException ex){}
   }
}

public class B{
    private A a;
    public B(A a){this.a = a;}
   pubic void run(){
       try{
           a.join();
       }catch(InterruptedException ex){}
    }
}

public static void main(String[] args){
    A a = new A();
    B b = new B(a);
    a.start();
    b.start();
   
    a.interrupt();//b在start之后就一直等待,直到执行到a.interrupt()或者a已经执行完毕(
a休眠时间到
}
 

 

  • 生产者与消费者
package com.icarusliu.learn.others;

/**
 * 账户
 * @author liuqi
 *
 */
public class Account {
    private int account;
    
    public Account(){
        this.account = 0;
    }
    
    public int getAccount(){
        return this.account;
    }
    
    public synchronized void deposite(int count){
        this.account += count;
        System.out.println("Deposite " + count);
        notifyAll();//每存一次就唤醒挂起在这个对象上面的线程
    }
    
    public synchronized void withdraw(int count){
        try{
            while(account<count){//如果不够,则进入等待,当有存储进行时,就会唤醒然后继续判断 是否足够
                System.out.println("It's too less!");
                wait();
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
        
        account -= count;
        System.out.println("Withdraw " + count);
    }
}
 
package com.icarusliu.learn.others;

/**
 * 消费者
 * @author liuqi
 *
 */
public class Consumer extends Thread{
    Account account;

    public Consumer(Account account    ){
        this.account = account;
    }
    
    public void run(){
        account.withdraw(100);
    }
}
 
package com.icarusliu.learn.others;

/**
 * 生产者
 * @author liuqi
 *
 */
public class Producer extends Thread{
    Account account;

    public Producer(Account account    ){
        this.account = account;
    }
    
    public void run(){
        int count = 0;
        while(count++<12){
            account.deposite(10);
            try{
                sleep(10);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
    }
}
 
package com.icarusliu.learn.others;

public class ThreadTest {
    Account count = new Account();
    Consumer cThread = new Consumer(count);
    Producer pThread = new Producer(count);
    
    public static void main(String args[]){
        ThreadTest t = new ThreadTest();
        t.cThread.start();
        t.pThread.start();
    }
}

 

 

//例子2,两个线程,一个给j加1,一个减1
package com.icarusliu.learn.thread;

public class ThreadTest {
    private int j;
    
    public ThreadTest(int j){
        this.j= j;
    }
    
    public synchronized void inc(){
        j++;
        j++;
        System.out.println("Add");
    }
    
    public synchronized void dec(){
        j--;
        System.out.println("Delete");
    }
    
    public class Inc extends Thread{
        public void run(){
            inc();
        }
    }
    
    public class Dec extends Thread{
        public void run(){
            dec();
        }
    }
    
    public static void main(String args[]){
        ThreadTest t = new ThreadTest(0);
        int i = 0;
        ThreadGroup g = new ThreadGroup("g");
        for(i=0;i<100;i++){
            Thread incThread = new Thread(g,t.new Inc(),"inc");
            Thread decThread = new Thread(g,t.new Dec(),"dec");
            incThread.start();
            decThread.start();
        }
        while(g.activeCount()!=0);
        System.out.println(t.j);
    }
}


 


总结:
    1.线程中同步代码一般是放在要共享的数据结构当中,而与特定的线程无关。
    2.可以利用线程组来判断是否所运行的线程都已经运行完成。

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值