1.java中如果我们没有产生线程,系统就会自动产生一个主线程,main()方法就在主线程上运行,我们的程序都是由线程来执行的。
程序是静态的概念,进程是动态的概念,就是进行中的程序。
多线程编程的最终目的就是使程序最大资源的占用CPU,使得效率提高。
2.一个程序可以包含多个线程,线程一旦运行起来就无法控制,所以一个程序中如果有多个线程,那么执行这个程序之后有可能第十行的代码比第三行的代码执行的还早。
网络数据传输,用户的输入,程序与io打交道等 都比CPU的处理速度慢的多。
3.线程实现的两种方式: 1.继承Thread类,重写run()方法 ,start()方法首先为线程准备好系统资源,启动线程,自动调用run()方法,start()方法不能重写
2.实现Runnable接口,实现run()方法
4.对单核CPU来说,线程微观串行,宏观并行;对双核及以上CPU来说,真正做到微观并行。
5.
源代码
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
public void run() {
if (target != null) {
target.run();
}
}
这两个方法都会调用init方法
当调用不带参数的方法时,我们要重写run方法,不然不会执行,因为target为空
当调用第二个构造方法是,等于调用target的run方法,target是实现了Runnable接口的类
而start方法为什么会调用run方法,java使用本地方法写的,我们不能查看
6. 在具体应用中,如果一个类继承了某个类,我们还想让他成为线程,只能使用第二种方法,实现Runnable接口
7.线程不能使用stop方法停止,只能是让run方法自然灭亡
停止线程推荐的方式:
public class MyThread implements Runnable
{
private boolean flag = false;
public void run()
{
while(flag)
{
.....
}
}
public void stopRunning()
{
flag = false;
}
}
8.
9. 线程的优先级不能完全决定线程的执行顺序,例如:如果有个线程级别为1的线程一直没有执行,系统就会逐渐提高他的优先级,而不是让他一直等待
10. 成员变量与局部变量的区别
11.synchronized关键字: java中的每一个对象都有一把锁,当访问某个对象的synchronized方法时,会对该对象上锁,其他线程将无法访问这个方法。知道对他上锁的线程对这个方法调用完毕,或者抛出异常,会将这个锁释放掉,其他线程才能访问这个方法。
如果一个对象有多个synchronized方法,当一个线程访问他的其中一个synchronized方法时,那么该方法没有执行完之前,其他线程无法访问这个对象的任何synchronized方法,因为第一个线程对这个<对象>上了锁
12.当synchronized就是的是static方法时,锁住的是当前这个对象对应的class对象,所以<同一个类>如果有两个synchronized修饰的static方法,他们执行的顺序是一个先执行,等一个执行完毕另一个才执行
13.synchronized第二种使用方式: synchronized代码块 写法:
Object object = new Object();
synchronized(object)
{
}
表示对Object对象上锁
14.synchronized修饰方法和synchronized块的区别:
synchronized块比较细粒度,因为他锁住的是某个方法中定义的一个成员变量,是的其他线程还可以访问这个方法中不是synchronized块的部分,而synchronized方法使得其他线程就无法访问这个方法了,因此我们在使用的时候要权衡好
15.被synchronized修饰的数据应该是private的,我们只能通过方法调用来访问她,如果是public,我们就可以用对象引用.数据的方式来访问,synchronized就失去了意义
16.
当其中一个线程成为Running状态的时候,他要访问synchronized方法发现这个对象被锁住了,所以他就进入锁池中等待,等锁被释放掉了,他获得了锁,就成为Runnable状态
17. wait()和notify()都被定义在Object中,很好的实现了线程之间的同步,它们不能被重写。这两个方法被调用时要求获得了当前对象的锁,所以wait和notify要放在synchronized方法或块中,且线程在wait时候会释放掉对象的锁
18. 另一个导致线程暂停的方法是sleep,它会指定线程睡眠的毫秒数,但是它不会释放掉对对象的锁