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

第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.


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值