java的并发

多线程就是分时利用CPU,宏观上让所有线程一起执行 ,也叫并发
一.关于Thread和Runable
Java中实现多现成有2种方式,1是集成Thread类,2是实现Runable接口。
Thread类有Start方法,可以实现多线程,缺点是java单继承的特点
Runable是实现接口,更为灵活,但没有start方法
所以 先下结论; 1、写一个类继承自Thread类,重写run方法。用start方法启动线程
2、写一个类实现Runnable接口,实现run方法。用new Thread(Runnable target).start()方法来启动.2才是常用的。
为什么要用start方法来调用run而不是直接调用run。
1.start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。
2.run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
原因:线程的起动并不是简单的调用了你的RUN方法,而是由一个线程调度器来分别调用你的所有线程的RUN方法,
我们普通的RUN方法如果没有执行完是不会返回的,也就是会一直执行下去,这样RUN方法下面的方法就不可能会执行了,可是线程里的RUN方法却不一样,它只有一定的CPU时间,执行过后就给别的线程了,这样反复的把CPU的时间切来切去,因为切换的速度很快,所以我们就感觉是很多线程在同时运行一样

二Synchronized
记住一点:Java中的同步块用synchronized标记。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。
所以本质上抓住拿到锁的对象就行了。
具体分就分为实例对象和类对象。再细一些就是写法在方法上,还是在对象上,只是写法的不同罢了
为了调用wait()或者notify(),线程必须先获得那个对象的锁。也就是说,线程必须在同步块里调用wait()或者notify()

参考资料:
[Java并发编程:Callable、Future和FutureTask]
(http://www.cnblogs.com/dolphin0520/p/3949310.html)
并发编程网
http://ifeve.com/java-concurrency-thread-directory/

你可能感兴趣的:(java的并发)