线程浅析

一、如何启动一个新的线程

1、建立Runnable对象(线程的任务)
     因为Runnable是接口,所以需要一个类实现这个接口。其实就是覆盖里面的run()方法。
     示例:
     
1 public class MyRunnable implements Runnable{
2        public void run(){
3               System.ou.println("这里放上的是需要执行的代码片段"):
4        }
5 }
2、建立Thread对象(线程的执行工人)
3、启动Thread。这时线程变成可执行的了,但还需等待JVM的调用才能变成“执行中”。
示例: 
1 Runnable runnable = new MyRunnable();
2 Thread myThread = new Thread(runnable);
3 myThread.start();
 
二、线程的特
1、会不断在“可执行”与“执行中”循环,线程调度器会做所有的决定,通常是公平的,但谁也无法保证某一个时刻执行的是哪个线程。
2、线程不会重新启动,一旦该线程的run()方法完成之后,该线程就死了。只留下Thread对象呆在堆上,但已经完全失去了线程的可执行性,不能再次给他Thread.start()的调用。
 
三、让线程小睡一下
以下代码可以保证线程在两秒之内不会醒来(被执行),当然醒来之后也不一定会被执行。
如果想要确保其他线程有执行的机会,就把线程放进睡眠状态。
1 try{
2     Thread.sleep(2000);
3 }catch(InterruptedException ex){
4     ex.printStackTrace();
5 }

 

四、测试线程
比较好的办法:使用.setName()对每一个线程取自己的名字,执行的时候,利用Thread.currentThread().getName();来获取名字,并打印出来。
 
五、处理并发问题
1、举例线程中的并发问题:
如果一个线程读到了某个数据后转入“可执行状态”,另一个线程修改了该数据。第一个线程醒来后继续使用原来的数据就会发生错误。
2、如何解决:
加锁。第一个线程读该数据时,就对该数据加锁。这样第二个线程就无法对该数据进行操作。只能第一个线程执行完毕后才解锁。
3、给谁以及如何加锁?
  (1)锁不是配在方法上的,而是配在对象上的。(但我们加锁一般是加在方法上或者代码段上)如果一个对象有两个同步化的方法,那么表示两个线程无法进入同一个方法,也无法进入不同的方法(因为该对象只有一个锁,拿走了就没了)
  (2)给方法加锁:
1  public sychronized void increment(){
2         int i = balance;
3         balance = i+1;
4 } 
  (3)给代码块加锁:
1 public void increment(){
2        int i = balance;
3        sychronized(this){
4              balance = i+1;
5        }
6 }
六、注意死锁
七、静态变量的保护             
       静态变量是运行中在类上而不是实例上,除了对象,类也有自己的锁。如果你对静态的方法做同步化,Java会使用类本身的锁。

 

posted @ 2014-11-19 20:03  kv_is_a_nlper  阅读(166)  评论(0编辑  收藏  举报