Java4Android(第36~39集)线程 及 同步
2014-04-22 21:48
435 查看
第36集 Java当中的线程(一)
本集主要内容.
1.进程和线程.
2.多线程程序运行模式.
3.定义线程的方法.
1)多线程与多进程
多进程:在操作系统中能(同时)运行多个任务。
多线程:在同一应用程序中有多个顺序流(同时)执行。
2)线程的执行过程
3)创建线程的方法
方式一:
定义一个线程类,它继承类Thread,并重写其中的run()方法,方法run()称为线程体。
由于Java只支持单线程,用这种方法定义的类不能再继承其它类。
程序:
比较头疼的一点是 这个多线程执行没有规律。
第37集 Java当中的线程(二)
实现线程的方法二:
实现Runnable接口,其对象作为参数传给Thread对象。
线程的简单控制方法.
中断线程
-Thread.sleep(time) //让出CPU,在time毫秒不去执行
-Thread.yield(); //让出CPU,再去竞争,可能可以竞争到.
设置线程的优先线
-getPriority(); //获取线程的优先级1-10
-setPriority(); //设置线程的优先级1-10
第38集 Java当中的线程(三)
本集主要内容.
1.多线程数据安全
2.同步线程的方法
第39集 Java当中的线程(三)
主要内容:
1. synchronized 锁住的是什么?
2. 线程同步的方法
代码1:
service 拿到这个this 同步锁之后 休眠3秒,这时t2.start(); 开始执行了,fun2()也进入synchronized(this) 同步代码块。因为这经锁已经被thread1拿到了,所以thread2无法执行同步代码块中的内容,打印不出fun2。
某些书上说,synchronized锁住的是那一个代码块,当一个线程执行时,另一个线程就不能执行。其它,这是错误的,例子中thread1和thread2 执行的不是同一个代码块。
所以,得出结论,synchronized 锁住的不是某一个同步代码块,锁住的是一个对象的同步锁。一旦某一线程获得了一个对象的同步锁(这里是service对象),那么这个对象上所有的被 同步的代码 其它的线程通通都不能执行,但是这个同步锁并不会影响非同步的代码。
程序2:同步方法
本集主要内容.
1.进程和线程.
2.多线程程序运行模式.
3.定义线程的方法.
1)多线程与多进程
多进程:在操作系统中能(同时)运行多个任务。
多线程:在同一应用程序中有多个顺序流(同时)执行。
2)线程的执行过程
3)创建线程的方法
方式一:
定义一个线程类,它继承类Thread,并重写其中的run()方法,方法run()称为线程体。
由于Java只支持单线程,用这种方法定义的类不能再继承其它类。
程序:
class FirstThread extends Thread{ public void run(){ for(int i = 0; i < 100;i++){ System.out.println("Thread print-->"+i); } } } //************************************************************// class Test{ public static void main(String args[]){ //生成线程类的对象 FirstThread ft = new FirstThread(); //启动线程 ft.start();//线程进入就绪状态 //ft.run();千万不能这样写,这样写就没有ft.这个线程序,只一个主线程. for(int i = 0; i < 100;i++){ System.out.println("main--->"+i); } } }当运行 Test当中的ft.start();时就有 3个线程,一个是main线程,一个是ft线程,第3个是线程垃圾回收线程(这个先不考虑)。
比较头疼的一点是 这个多线程执行没有规律。
第37集 Java当中的线程(二)
实现线程的方法二:
实现Runnable接口,其对象作为参数传给Thread对象。
class RunnableImpl implements Runnable{ public void run(){ for(int i = 0; i < 100;i++){ System.out.println("Runnable---->"+i); if(i==50){ try{ Thread.sleep(2000); } catch(Exception e){ System.out.println(e); } } } } } //*****************************************************************// class Test{ public static void main(String args[]){ //生成一个Runnable接口实现类的对象 RunnableImpl ri = new RunnableImpl(); //生成一个Thread对象,并将 Runnable接口实现类的对象作为参数 //传递给该Thread对象 Thread t = new Thread(ri); //线程的优先级最大是10,最小是1,可以使用Thread所提供的静态 //常量来设置线程的优先级. // Thread.MAX_PRIORITY // Thread.MIN_PRIORITY // 线程优先级最高执行概率越大 //t.setPriority(Thread.MAX_PRIORITY); t.setPriority(Thread.MIN_PRIORITY); //通知Thread对象,执行start方法 t.start(); System.out.println(t.getPriority()); } }Thread 是 线程,RunnableImpl 是线程体。
线程的简单控制方法.
中断线程
-Thread.sleep(time) //让出CPU,在time毫秒不去执行
-Thread.yield(); //让出CPU,再去竞争,可能可以竞争到.
设置线程的优先线
-getPriority(); //获取线程的优先级1-10
-setPriority(); //设置线程的优先级1-10
第38集 Java当中的线程(三)
本集主要内容.
1.多线程数据安全
2.同步线程的方法
class MyThread implements Runnable{ int i = 1000; public void run(){ while(true){ synchronized(this){//相当一部同步锁 System.out.println(Thread.currentThread().getName()+i); i--; Thread.yield(); if(i < 0){ break; } } } } } //*****************************************************************// class Test{ public static void main(String args[]){ MyThread myThread = new MyThread(); //生成两个Thread对象,但是这两个Thread对象共同一个线程体 Thread t1 = new Thread(myThread); Thread t2 = new Thread(myThread); //每一个线程都有名字,可以通过Thread对象的 //setName()方法设置线程名字,也可以使用getName方法线程的名字. t1.setName("线程A"); t2.setName("线程BBBB"); t1.start(); t2.start(); } }
第39集 Java当中的线程(三)
主要内容:
1. synchronized 锁住的是什么?
2. 线程同步的方法
代码1:
//*********************************************************************// class Service{ public void fun1{ synchronized(this){ tyr{ Thread.sleep(3000); } catch(Exception e) { System.out.println(e); } System.out.println("fun1"); } } public void fun2{ synchronized(this){ System.out.println("fun2"); } } } //**********************************MyThread1***********************************// class MyThread1 impelements Runnable{ private Service service; public MyThread1(Service service){ this.service=service; } public void run(){ service.fun1; } } //**********************************MyThread2***********************************// class MyThread2 impelements Runnable{ private Service service; public MyThread2(Service service){ this.service=service; } public void run(){ service.fun2; } } //*********************************************************************// class Test{ public static void main(String args[]){ Service service=new Service(); Thread t1=new Thread(new MyThread1(service)); Thread t2=new Thread(new MyThread2(service)); t1.start(); t2.start(); } }t1.start(); 启动线程1,线程1执行的是fun1(),fun1() 进入 synchronized(this) 同步代码块,这个this 指的是调用fun1方法的class Service的对象,即Thread t1=new Thread(new MyThread1(service)); 传进去的service. new Thread(xxx) 这里面传什么参数,要看这个类的构造函数。
service 拿到这个this 同步锁之后 休眠3秒,这时t2.start(); 开始执行了,fun2()也进入synchronized(this) 同步代码块。因为这经锁已经被thread1拿到了,所以thread2无法执行同步代码块中的内容,打印不出fun2。
某些书上说,synchronized锁住的是那一个代码块,当一个线程执行时,另一个线程就不能执行。其它,这是错误的,例子中thread1和thread2 执行的不是同一个代码块。
所以,得出结论,synchronized 锁住的不是某一个同步代码块,锁住的是一个对象的同步锁。一旦某一线程获得了一个对象的同步锁(这里是service对象),那么这个对象上所有的被 同步的代码 其它的线程通通都不能执行,但是这个同步锁并不会影响非同步的代码。
程序2:同步方法
class Service{ public synchronized void fun1{ //方法二:同步方法 tyr{ Thread.sleep(3000); } catch(Exception e) { System.out.println(e); } System.out.println("fun1"); } public void fun2{ synchronized(this){ //方法一:同步锁 System.out.println("fun1"); } } }方法一锁住的对象非常明确,就是this. 那方法二锁住的是哪个对象呢? 锁住的就是this.
相关文章推荐
- Android.mk中call all-subdir-makefiles和call all-makefiles-under,$(LOCAL_PATH)的区别
- Android开发之自定义控件-模仿QQ输入框
- Learn Java for Android Development Second Edition 笔记(三)
- [Android学习系列8]数据库ormlite笔记
- Android LayoutInflater原理分析
- [Android学习系列7]数据库学习笔记
- [Android学习系列6]一些xml布局的小技巧
- Android 分析log
- Android-加载图片OOM总结
- Android开发之自定义控件-YouKu圆盘菜单
- android点击状态分析
- Android自由落体距离
- Android权限之sharedUserId和签名
- 【Android自动触发】
- Android变量交换
- Android旅程开启
- Android SurfaceView讲解
- Android编译系统详解(一)
- Android基本数据类型测试
- 从零开始开发Android版2048 (一)初始化界面