对于Java多线程的一些使用总结:
- 1.进程和进程之间的内存是独立的(服务之间内存相互独立的)。
- 2.多进程的程序是为了提高CPU的使用率。
- 3.多线程不是为了提高执行速度,而是为了提高应用程序的使用率。
- 4.线程和线程共享“堆内存和方法区内存”,栈内存是独立的也就是说一个线程一个栈。
- 5.关于java程序的运行原理:java命令会启动java虚拟机JVM,也就等同于启动了一个应用程序(进程)。该进程会启动一个“主线程”,该主线程会启动某一个类的main方法,所以主线程运行在主线程中。
- 6.t.stare(); 该方法执行瞬间结束,就是告诉JVM分配一个新的线程栈给线程t。也就是说main()方法结束,程序不一定结束。这个新的栈调用run()方法。
- 7.t.run(); 这是普通方法调用,只有一个线程,当前run方法结束之后下面的程序才会执行。
- 8.Thread.sleep();该方法是一个静态方法,作用是阻塞当前线程。 这个方法在那个线程中就阻塞的是哪个线程。
- 9.t03.interrupt(); 唤醒t03线程。中段线程的休眠。使用的是异常处理机制。触发InterruptedException的异常。
- 10.如何正确的终止我们的线程,使用全局变量,改变全局变量的值,解除休眠。一般使用boolean类型。
- 11.Java线程调度yield与join http://www.cnblogs.com/tankaixiong/articles/4737014.html (线程让位和线程合并)。
join方法:
线程实例的join()方法可以被用来join到线程执行的开始和其他线程执行的结束,所以直到其他线程运行结束这个线程才会执 行。如果join的方法在线程实例中被调用,当前运行的线程会被堵塞,直到线程实例运行完成。
如 :线程a中调用线程b的join方法,这时线程a就会进入阻塞状态,直到线程b执行
yield方法:
yield的意思是放弃,投降的意思。其实调整的是线程优先级。当前线程调用yield的时候,告诉虚拟机它愿意让其他的线程抢占自己的位置。者表明该线程没有紧急的事要做,但这只是一种暗示,并不能保证一定会发生。
- 12.异步编程模型:t1,t2 两个线程,t1线程执行t1的,t2线程执行t2的,两个线程直接没有相互的等待。
- 13.同步编程模型:t1,t2 两个线程,t2线程的执行必须得等待t1线程执行结束才能执行。
- 14.使用线程同步的条件
1)必须存在多线程环境。
2)多线程存在共享同一数据。
3)共享数据涉及到修改操作。
- 15.关于线程同步的 synchronized 的使用方法。
1),synchronized(this){ //共享代码块} 也就是说由synchronized包住的代码块添加了锁,当一个线程获得了该锁,则其他线 程只能等待该线程释放该锁之后才能执行。
2),synchronized 可以修饰某个方法,例如: public synchronized void takeMoney(double money){} 表示为该方法添加了锁。调度如上。
3),synchronized 可以修饰某个static 方法,表示添加了类锁,线程在调用该方法的时候会调用类锁。类锁只有一个。
- 16.关于守候线程:线程可以分为用户线程和守候线程。我们上面所以的线程都是用户线程。守候线程守候的是用户线程,就是还有一个用户线程还在运行的话,守候线程也是不会停止工作的。java中的垃圾回收机制就是一个守候线程。 守护线程一般是无限循环的,可以将一个将一个用户线程t1设置t1.setDaemon(true);标记为守候线程。
- 17.java.util.Timer 是一个定时任务类。里面有一个 public void schedule(TimerTask task, Date firstTime, long period);方法。
- 18.线程之间的通信
- 19.ThreadLocal是指的线程上下文,本身ThreadLocal是一个全局变量,但是在不同线程种可以set不同的指,而这些值之间又不会互相影响。本线程set的值之和本线程有关。