java多线程的学习.doc

java多线程的学习

Java多线程的学习 Java线程 一般我们写的程序是单线程的,其main函数就是启动单线程的入口。在java中可以实现Runable接口或是继承Thread来实现多线程,要实现多线程,就必须执行线程的star方法,执行start方法后,java会在后台启动一个新的线程并执行run方法,当然你也可以直接执行run方法,但是就不会去启动新的线程了。下面是一个多线程的例子 public class ThreadMutile { /** * @param args */ public static void main(String[] args) { ThreadZou t=new ThreadZou(); t.start();//新启动一个线程 for(int i=0;i100;i++) System.out.println(main); } } class ThreadZou extends Thread{ @Override public void run() { // TODO Auto-generated method stub for (int i=0;i100;i++) System.out.println(zouxiaohu); } } 这里会有两个线程一个是main函数,一个是新建立的线程。你会发现其每次执行结果会有所不同,这是因为线程并发运行的结果 实现线程有两种方法,上面说的是去继承Thread类,另一个方法是去实现Runable接口,然后将其示例传递给Thread构造器进行实例化一个线程,最后调用start方法来进行新建一个线程。注意:无论是哪种进行实现线程,新建线程的方法永远是进行调用start方法。 线程的操作 Sleep方法进行暂停,该方法是Thread类的类方法,用法如下: public static void main(String[] args) { for(int i=0;i100;i++) { System.out.println(tt); try { Thread.sleep(2000);//单位ms } catch (InterruptedException e) { // TODO Auto-generated catch block } } 这里是每隔2秒会进行打印,与暂停对应的方法是半路唤醒,即是interrupt方法。后面会进行介绍; 当多个线程访问一个共享资源时此时需要进行方法的同步即是互斥。比如银行的取款的逻辑如下: If 存款金额取款金额 进行取款 可能会发生的情况是,两个线程a,b进行同时的访问,刚好b线程夹在a线程的确定余额和可用取款之间,那么就会发生两个线程都进行了取钱,最后则是余额是负数了。因此需要进行方法的同步 下面是同步块的方法: public class Bank { private String name; private int money; public Bank(String name,int money){ this.money=money; this.name=name; } //进行存款 public synchronized void deposit(int m) { money+=m; } public String getName() { return name; } public void setName(String name) { this.name = name; } //进行取款 public synchronized boolean withdrow(int n) { if(money=n){ money=-n; return true; }else{ return false; } } public static void main(String[] args) { } } 注意:对于同一实例只能有一个线程去访问同步的方法(如果有两个实例那么一个实例如果有线程在执行同步方法,不会影响到另一实例的锁定即是:只要有实例,就会有一个锁定)也就是说如果有线程在进行去钱调用withdrow方法,那么该线程就会去加锁,其余的线程是无法进行调用其他的同步方法(存钱,取钱)此时只能进行等待获取锁。 如果想进行锁定方法的局部,那么可以利用同步代码块 synchronized (表达式)后面进行讲解。也可以定义类方法的同步:

文档评论(0)

1亿VIP精品文档

相关文档