线程

转载请注明出处

一.

1.进程和线程

2.多线程程序运行模式

3.定义线程的方法

二.

1.实现线程的第二种方法

2.控制线程的常用函数

三.

1.多线程数据安全

2.同步线程的方法


一.

多线程和多进程

多进程:在操作系统中能(同时)运行多个任务(程序)

多线程:在同一应用程序中有多个顺序流(同时)执行


Runnable就绪状态,只是准备开始运行


创建线程的方法

方法1.定义一个线程类,它继承类Thread并重写其中的方法run(),方法run()             成为线程体;

          由于Java只支持单继承,用这种方法定义的类不能再继承其它类。

方法2.提供一个实现接口Runnable的类作为线程的目标对象,再初始化一个Thread             类或者Thread子类的线程对象时,把目标对象传递给这个线程实例,由该目标           对象提供线程体。


方法1程序:

class FirstThread extends Thread{
		public void run(){
				for(int i =0;i<100;i++){
				System.out.println("FirstThread-->"+i);
		}
	}
}

class Test{
		public static void main(String args[]){
			  //生成线程类的对象
				FirstThread ft = new FirstThread();
			  //启动线程
			  ft.start();
			  //ft.run();千万不能这样写
			  
			  for(int i =0;i<100;i++){
				System.out.println("main-->"+i);
		}
			}
			
	}
结果:


二.

方法2程序:

class RunnableImpl implements Runnable{
		public void run(){
				for(int i =0;i<100;i++){
						System.out.println("Runnable"+i);
					}
			}
	}

class Test2{
		public static void main (String args[]){
				//生成一个Runnable借口实现类的对象
				RunnableImpl ri = new RunnableImpl();
				//生成一个Thread对象,并将Runnable接口实现类的对象作为参数
				//传递给该Thread对象
				Thread t = new Thread(ri);
				//通知Thread对象,执行start方法
				t.start();
				
			}
	}



三.同步线程的方法

class MyThread implements Runnable{
		int i = 100;
		public void run(){
				while(true){
						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("线程b");
				
				t1.start();
				t2.start();
			}
	}
结果:

可以看出数字是混乱的

修改myThread ,加入同步锁synchronized(this){}

class MyThread implements Runnable{
		int i = 100;
		public void run(){
				while(true){
						synchronized(this){
						System.out.println(Thread.currentThread().getName()+i);
						i--;
						Thread.yield();
						if(i<0){
								break;
							}
					}}
					
					
			}
	}

结果:

数字是连续的,但a与b交替。

         同步锁里面的程序就是所谓的同步代码块,括号里面的this是一个对象,代表调用run()的对象。

         这个代码的执行过程:a获得了同步锁,也就是把同步锁占住了,比如有一个浴室,谁拿到牌子,谁就可以去洗澡,另外一个人就要等;a执行同步代码块中的代码执行到一半,CPU被b抢走,b运行,但是发现同步锁被a拿走了,b不能执行代码块里面的程序,必须等待,等待到a重新执行,一直等a执行完后,a释放这个锁,然后b拿到锁后,b才可以执行同步代码块里面的程序。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值