• Java进程与多线程+线程中的join、yield、wait等方法+synchronized同步锁使用


    首先了解什么是多线程与进程

    进程:是一个执行过程,动态的概念 --->会分配内存
    线程:是进程的一个单元,线程是系统最小的执行单元

    详解:
    http://blog.csdn.net/luoweifu/article/details/46595285
    线程的同步与锁详解:

    http://blog.51cto.com/lavasoft/99155

    synchronized的使用概括:

    1.synchronized只锁定同一个对象中的线程,不同对象的线程无法锁定。锁定的对象只能由当前线程执行,其他线程不能执行,直到当前线程被释放。

    2.当一个线程访问对象的一个synchronized(this)同步代码块时,另一个线程可以访问这个对象中的非synchronized(this)代码块

    3.给一个对象加锁,在run方法中可对一个对象加锁,是的同时只能由一个线程访问此被加锁的对象,其他试图访问account对象的线程将会阻塞,直到该线程访问account对象结束

    4.修饰一个方法:

    public synchronized void method()    
    {    
    }
    在用synchronized修饰方法时要注意以下几点: 

    (1) synchronized关键字不能继承。 

    (2)在定义接口方法时不能使用synchronized关键字。

    (3)构造方法不能使用synchronized关键字,但可以使用synchronized代码块来进行同步。 

    5.修饰一个静态方法:

    静态方法是属于类的而不属于对象的。同样的,synchronized修饰的静态方法锁定的是这个类的所有对象,即此类的所有的对象都受这个同步锁的约束,这与1中的情况不同。

    6.修饰一个类,作用同5一样

    java中线程锁:一个对象只能有一个锁,当一个线程获得锁之后,其他线程就无法获得,直到这个线程被释放,重要作用就是:防止多个线程同时对一个数据进行处理造成错误

    synchronized的使用详解
    http://blog.csdn.net/luoweifu/article/details/46613015
    Thread中的sleep、wait、yield、notify、notifyall、join方法

    sleep()方法会让当前线程暂停执行指定的时间,将执行机会(cpu)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复,且sleep方法暂停后,其他线程都可以有执行的机会,包括低优先级的线程

    yield方法与sleep方法类似,但是不能指定用户暂停多长时间,且只能让通优先级的线程有执行的机会

    join,使调用join方法的线程执行完毕后,其他线程才能够继续执行,即顺序执行


    t1.start();  
           //等待t1结束,这时候t2线程并未启动  
           t1.join();  
             
           //t1结束后,启动t2线程  
           t2.start();  
           //等待t2结束  
           t2.join(); 

    wait()、notify()、notifyall()都是是object类的方法,wait会让当前线程放弃对象的锁(线程暂停执行),进入对象等待池,只有调用对象的notify方法才能唤醒等待池中的线程进入等锁池,如果线程重新获得对象的锁就可以进入就绪状态。

    notifyall方法则是将对象等待池中的所有等待那个对象的线程放到等锁池中

    线程的创建方式:1.继承Thread类实现其中的run方法,在run方法中实现执行代码

    public class JavaThread extends Thread{  
        @Override  
        public void run() {  
            boolean flag= true;  
            int i = 0;  
            while(flag){  
                System.out.println(getName()+"我是线程1");  
                if(i++==100){  
                    break;  
                }  
            }  
              
            System.out.println("我要走了");  
        }  
    此方法需要用Thread类new一个线程,然后调用start()方法启用线程
    Thread th = new JavaThread();  
            th.setName("哈哈哈");  
            th.start();  
    2.实现runnable接口,实现其中的run方法
    class Actress implements Runnable{  
        @Override  
        public void run() {  
              
            boolean flag= true;  
            int i = 0;  
            while(flag){  
                System.out.println(Thread.currentThread().getName()+"我是线程2");  
                if(i++==100){  
                    break;  
                }  
            }  
              
        }  
          
    }
    Thread t1 = new Thread(new Actress());  
            actressTh.start();  





  • 相关阅读:
    有序数组中找中位数
    卡特兰数 catalan number
    海量数据等概率选取问题
    求字符串中最长无重复字符的子串
    Linux的进程通信(IPC)
    Linux多线程编程
    后缀数组处理字符串的利器
    网络编程socket基本API详解
    Windows线程的创建与终止
    《算法导论》读书笔记之第10章 基本数据结构之二叉树
  • 原文地址:https://www.cnblogs.com/tonghao/p/8506028.html
Copyright © 2020-2023  润新知