首页 > 代码库 > 线程浅析
线程浅析
一、如何启动一个新的线程
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会使用类本身的锁。
线程浅析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。