----------------------
android培训、
java培训、期待与您交流! ----------------------
线程和进程
进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。
线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。
“同时”执行是人的感觉,在线程之间实际上轮换执行。
如何启动线程
在Java中我们用Thread这个类来代表线程,我们通过Thread类中的start方法来启动线程而不是run方法。启动线程有两种方式,一种是通过继承Thread类,一种是
通过实现Runnable接口,那两者又有什么区别呢??实现的好处就是避免了单继承的局限性,还有就是实现Runnable接口可以实现资源的共享。
通过下面的代码来分析:
synchronized 关键字
代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行 它包括两种用法:
synchronized 方法和 synchronized 块。
synchronized 块
通过 synchronized关键字来声明synchronized 块。
语法如下:
synchronized(syncObject) {
//允许访问控制的代码
}
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任
意代码块,且可任意指定上锁的对象,故灵活性较高。
线程的五种状态:
死锁
死锁可能是多线程程序最常见的问题。当一个线程需要一个资源而另一个线程持有该资源的锁时,就会发生死锁。这种情况通常很难检测。但是,解决方案却相当好:在所有的线程中按相同的次序获取所有资源锁。例如,如果有四个资源 ―A、B、C 和 D ― 并且一个线程可能要获取四个资源中任何一个资源的锁,则请确保在获取对 B 的锁之前首先获取对 A 的锁,依此类推。如果“线程 1”希望获取对 B 和 C 的锁,而“线程 2”获取了 A、C 和 D 的锁,则这一技术可能导致阻塞,但它永远不会在这四个锁上造成死锁。
ava的wait方法就是使拥有当前对象(Object)的线程(Thread)放弃锁(release lock).进入睡眠状态.
notify 通知在对象(Object)上因调用wait而等待的某一进程启动.
notifyAll 通知在对象(Object)上因调用wait而等待的所有进程启动.这些进程根据优先级顺序执行.
进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。
线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。
“同时”执行是人的感觉,在线程之间实际上轮换执行。
如何启动线程
在Java中我们用Thread这个类来代表线程,我们通过Thread类中的start方法来启动线程而不是run方法。启动线程有两种方式,一种是通过继承Thread类,一种是
通过实现Runnable接口,那两者又有什么区别呢??实现的好处就是避免了单继承的局限性,还有就是实现Runnable接口可以实现资源的共享。
通过下面的代码来分析:
class Demo extends Thread
{
public void run()
{
for(int x =0;x<60;x++)
System.out.println("Demo run......"+x);
}
}
class ThreadDemo
{
public static void main(String[] args)
{
Demo d = new Demo();
d.start();
for(int x =0;x<60;x++)
System.out.println("nihao-----"+x);
}
}
//为什么要覆盖run方法呢?
//Thread类用于描述线程。
//该类定义了一个功能,用于存储线程要运行的代码。
//该存储功能就是功能就是run方法。
//也就是说Thread类中的run方法,用于存储线程要运行的代码。
//为什么要复写Thread类中的run方法:目的将自定义代码存储在run方法。让线程运行。
//d.start();是调用父类的start方法,
//再去调用run(),run()方法是给子类复写过的。start是调用底层让控制器去实现多线程。
//d.start();开启线程并执行该线程的run方法。
//d.run()仅仅是调用,没有开启多线程。
//run只是封装线程要运行的代码
synchronized 关键字
代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行 它包括两种用法:
synchronized 方法和 synchronized 块。
synchronized 块
通过 synchronized关键字来声明synchronized 块。
语法如下:
synchronized(syncObject) {
//允许访问控制的代码
}
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任
意代码块,且可任意指定上锁的对象,故灵活性较高。
线程的五种状态:
死锁
死锁可能是多线程程序最常见的问题。当一个线程需要一个资源而另一个线程持有该资源的锁时,就会发生死锁。这种情况通常很难检测。但是,解决方案却相当好:在所有的线程中按相同的次序获取所有资源锁。例如,如果有四个资源 ―A、B、C 和 D ― 并且一个线程可能要获取四个资源中任何一个资源的锁,则请确保在获取对 B 的锁之前首先获取对 A 的锁,依此类推。如果“线程 1”希望获取对 B 和 C 的锁,而“线程 2”获取了 A、C 和 D 的锁,则这一技术可能导致阻塞,但它永远不会在这四个锁上造成死锁。
ava的wait方法就是使拥有当前对象(Object)的线程(Thread)放弃锁(release lock).进入睡眠状态.
notify 通知在对象(Object)上因调用wait而等待的某一进程启动.
notifyAll 通知在对象(Object)上因调用wait而等待的所有进程启动.这些进程根据优先级顺序执行.
---------------------- android培训、java培训、期待与您交流! ----------------------