论坛首页 Java企业应用论坛

多线程总结

浏览 1021 次
锁定老帖子 主题:多线程总结
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-06-16  
多线程是指在同一应用程序下有多个顺序流同时执行
在java中定义一个新的线程类有两种方式:
1)实现runnable接口
2)继承Thread类并重写其run方法
Start方法和run方法的区别:
当要启动线程的时候,调用线程类的start方法即可以启动线程,告诉cpu该线程已经准备好,此时,线程并没有真正的运行,它必须等待cpu的调度,当cpu将时间片分给了该线程,会调度当前线程的run方法,线程才开始真正的执行。run方法由cpu调度,如果用户手动地调用线程类对象的run方法,则是普通的方法调用,不是启动线程。
线程有四种状态,任何一个线程肯定处于这四种状态中的一种:
产生(New):通过new产生了一个线程对象后没对它调用start()函数之前。
就绪:调用线程类对象的start方法后进入就绪状态,等待cpu的调度。
运行:cpu在空闲或者适当的是给线程分得时间片,调用线程的run方法,线程开始执行。当时间片执行完后又重新回到就绪状态,重新进入等待队列,等待cpu的调度。
阻塞:当线程正在运行的时候遇到情况被阻塞,在阻塞解决前处于阻塞状态。当阻塞解除后线程重新进入就绪或者终止状态。
终止:run方法执行完毕,线程也就运行完,进入终止状态。
线程同步:多线程通常会涉及线程同步的问题。
当多个线程同时访问一个公共的资源时,可能会导致数据的不安全。为了保证对共享数据操作的完整性,可以对公共的资源加锁。每个对象都有一个“互斥锁”的标记,这个标记保证在任一时刻,最多只能有一个线程访问该对象。当某个对象被synchronized关键字修饰时,表示该对象在任一时刻只能有一个线程访问。可以在代码块里加锁,也可以在方法声明中加锁。
线程控制的基本方法:
isAlive():判断线程是否是活着的:就绪、运行、阻塞状态时返回true。创建和终止返回false。
setPriority():设置线程的优先级。线程的优先级别用数字表示,范围从1到10,一个线程的缺省优先级别是5,数字越大,优先级别越高,获得cpu的执行时间片越多。
Thread.sleep():它是Thread类的静态方法,使当前线程(即调用该方法的线程)暂停执行指定的一段时间,让其他线程有机会继续执行,但如果该线程所执行的方法是锁定的,则它并不释放对象锁,其他线程仍然不同访问共享数据。
wait():它是java.lang.Object类的方法。wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中。当调用 notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。wait()和notify()、notifyAll():这三个方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使用这三个方法。Synchronized这个关键字用于保护共享数据,阻止其他线程对共享数据的存取。如果需要在当前线程还没退出Synchronized数据块时让其他线程也有机会访问共享数据,此时就用这三个方法来灵活控制。
join():调用指定线程的join()方法,将当前线程与指定线程合并,当指定线程结束,再恢复当前线程的运行。
yield():让出cpu,当前线程进入就绪队列等待cpu的调度。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics