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

时间:2021-07-25 13:06:27

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

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

详解:
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();