创建线程的两种方法:1、继承Thread。2、实现Runnable。
Runnable只有一个方法run();实现Runnable,用new Thread(Runnable run)创建线程。
1、多线程中有主内存和工作内存之分, 在JVM中,有一个主内存,专门负责所有线程共享数据;而每个线程都有他自己私有的工作内存, 主内存和工作内存分贝在JVM的stack区和heap区。
2、线程的五种状态:Ready,Running,Sleeping,Blocked,Waiting。其中Ready状态的线程正在等待分配CPU时间。
3、线程运行次序并不是按照我们创建他们时的顺序来运行的,CPU处理线程的顺序是不确定的,如果需要确定,那么必须手工介入,使用setPriority()方法设置优先级。
4、Daemon线程区别一般线程之处是:主程序一旦结束,Daemon线程就会结束。
5、一个对象中的所有synchronized方法都共享一把锁,这把锁能够防止多个方法对通用内存同时进行的写操作。synchronized static方法可在一个类范围内被相互间锁定起来。
6、synchronized会降低性能,确定需要再用他。
所有线程都运行在线程调度机制的基础上,yield(),sleep(),wait(),setPriority()只是给线程调度提出些要求和建议,但这不能保证什么。所以编程前先想想,多线程是不是你想要的,如果需要精确的控制执行顺序,放弃他。
解析:
public class Foo()
{
private int i;
public synchronized void A(){}
public synchronized void B(){}
public void C(){}
}
类Foo中的所有synchronized方法共享一把锁,当一个对象的A方法被调用时,该对象上对B方法的调用也会进入阻塞状态,但C方法的调用正常进行。
在线程的run()中加入yield()、sleep()有时会使程序运行的更快。
因为运行会不断在线程间切换,加入yield()、sleep()能有效阻止这种切换。
sleep()不会使对象释放持有的锁。
wait()使本线程释放持有的锁。