您的位置:首页 > 移动开发 > Android开发

Java4Android(第36~39集)线程 及 同步

2014-04-22 21:48 435 查看
第36集  Java当中的线程(一)

本集主要内容.

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: