多线程学习笔记

来源:互联网 发布:java交流平台怎么写 编辑:程序博客网 时间:2024/06/07 01:40


线程:是指一个程序里不同的执行路径 ,每一个分支都叫一个线程,main()方法叫主线程,
进程是一个静态的概念,每一个exe文件,class文件都是一个进程,通常说的进程开始执行,是指main()方法开始执行。
多进程:在操作系统中能同时运行多个任务(程序)。
多线程:在同一应用程序中能够有多个顺序流同时执行

在一个时间点上cpu中只有一个线程在运行。
java的线程是通过java.lang.Thread类来实现的。可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。线程启动必须通过调用Thread类的start()方法调用run()方法。

创建线程有两种方法:

1、实现Runnable接口,写run方法。


public class TestImplements {public static void main(String[] args) {Runner r = new Runner();Thread t = new Thread(r);t.start();}}class Runner implements Runnable {public void run() {}}


2、从Thread类继承,重写run方法。


public class TestExtends {public static void main(String[] args) {TestThread t = new TestThread();t.start();}}class TestThread extends Threnad {public void run() {}}


使用接口比较灵活,还可以实现其他接口,一般只要是能使用接口就不是从Thread类继承。

sleep()方法可以调用Thread的静态方法:使当前线程休眠,可用类名直接调用。
join()方法:合并某个线程。
yield()方法:让出cpu,给其他线程执行的机会。

优先级就是cpu先执行那个线程,执行时间间隔的长,方法setPriority(int newPriority);
NORM_PRIORITY,为分配给线程的默认优先级;MIN_PRIORITY和MAX_PRIORITY分别为最低和最高优先级。

线程同步: 
给一个方法增加synchronized修饰符之后就可以使它成为同步方法,这个方法可以是静态方法,也可以是非静态方法,但是不能是抽象类的抽象方法,也不能是接口中的接口方法。线程在执行同步方法时具有排他性。即当任意一个线程进入到一个对象的任意一个同步方法时,这个对象的所有同步方法都被锁定了。但是可以访问这个对象的所有非同步方法。     
锁定当前对象,即当一个线程在执行括号内的语句时,不会被另外一个线程打断。
如直接写在方法中,public synchronized  void    add()
执行这个方法的过程中,当前对象被锁定。
锁定只是说把锁定的方法内的语句只允许当前线程执行,别的线程不能执行。但是并不影响别的线程访问别的方法。

死锁现象:
        就是一个进程中的每个线程都在等待这个进程中的其他线程释放所占有的资源,从而导致所有线程都无法继续执行的情况。解决是尽量值锁住一个对象,不是很必要时可以加大锁的粒度,即加 大加锁的范 围。

wait()让自己睡过去。
notify()叫醒现在wait在某一个对象上的其他的线程。
notifyAll()叫醒wait在某一个对象上的所有线程。
wait()方法的几个特性:
1、是本地方法,属于Object类;
2、当调用了某个对象的wait()方法时,当前运行的线程会转入等待状态,等待别的线程再次调用这个对象的notify()或者notifyAll()方法唤醒它,或者到了指定的最大等待时间,线程自动醒来;
3、在调用了wait()后,这个线程就会释放它持有的所有同步资源;
4、wait()方法同样会被Thread类的interrupt()方法中断,并产生一个InterruptException异常,效果同sleep()方法被中断一样。
 
wait()和sleep()的区别:
 wait()时别的线程可以访问锁定对象,是Object类的方法;
sleep()时别的线程也不可以访问锁定对象,是Thread类的方法。 

当一个线程进入一个对象的一个synchronized方法后,其他线程是否可以进入此对象的其他方法?
        1、其他方法前是否加了synchronized关键字,如果没有,则能。
        2、如果这个方法内部调用了wait,则可以进入其他synchronized方法。
        3、如果其他的方法都加了 synchronized 关键字,并且内部没有调用wait, 则不能。 
        4、如果其他方法是static,它用的同步锁死当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。




0 0