黑马程序员---线程

------- android培训java培训、期待与您交流! ----------

线程:

进程:是一个正在执行中的程序。

每一个进程执行都有一个执行顺序,改顺序是一个执行路径,或者叫一个控制单元。

线程:就是进程中的一个独立的控制单元。  线程在控制着进程的执行。

一个进程中至少有一个线程。

Java VM 启动的时候会有一个进程:java.exe.

该进程中至少有一个线程负责java.exe的执行,这个线程运行的代码存在于main方法中,该线程称为主线程

扩展:有些教材说虚拟机启动时就是一个单线程程序,其实jvm启动时不只一个线程,例如还有垃圾回收机制的线程。

1,如何自定义一个线程?

通过对api文档的查找,java已经提供了对线程这类事物的描述:thread类。

创建线程的第一种方式:继承Thread类。

步骤:

1,定义线程继承thread

2,覆盖thread类中的run方法,因为thread类中定义了存储线程要运行代码的run方法。

3,调用线程的start方法(功能:1,启动线程;2,调用run方法。)

练习:创建两个线程和主线程交替运行:

  class Demo extends Thread
  {
  	private String name;
  		Demo(String name)
  		{
  			this.name=name;
  		}
  	public void run()
  	{
  		
  		for(int x=0;x<50;x++)
  		{
  		System.out.println(name+"Demo run"+x);
  		}
  	}
  }
  
  
  class  ThreadDemo
  {
  	public static void main(String[] args) 
  	{
  		Demo d1=new Demo("d1");
  		Demo d2=new Demo("d2");
  		d1.start();
  		d2.start();//如果写d2.run();执行结果是按顺序执行,不交替。
  		for(int x=0;x<50;x++)
  		{
  				System.out.println("Hello World!"+x);
  		}
  	}
  }


 

线程的状态:

创建线程的第二种方法:

实现Runnable接口

需求:简单的卖票程序

多个窗口卖票

步骤:

1,定义类实现Runnable接口

2,覆盖Runnable接口中的run方法

线程需要运行的代码存放在该run方法中

3,通过Thread类建立线程对象

4,将Runnable接口的子类对象传递给Thread的构造函数

5,调用Thread类的start方法开启线程。

实现的方法的好处避免了单继承的局限性

区别:

继承Thread:线程代码存在于Thread子类的run()

实现Runnable:线程代码存在于接口子类的run()

  class Ticket implements Runnable
  {
  	private int tick=100;
  	public void run()
  	{
  		while (true)
  		{
  		if(tick>0)
  		{
  			System.out.println(Thread.currentThread().getName()+"....sale:"+tick--);
  		}
  	}
  }
  }
  class  TicketDemo
  {
  	public static void main(String[] args) 
  	{
  		Ticket t=new Ticket();
  		Thread t1=new Thread(t);
  		Thread t2=new Thread(t);
  		Thread t3=new Thread(t);
  		Thread t4=new Thread(t);
  		t1.start();
  		t2.start();
  		t3.start();
  		t4.start();
  
  	}
  }


 

多线程安全问题

问题的原因:

当多条语句在操作同一个线程共享数据时,一个线程未执行完多条语句另一个线程参与进来执行导致了共享数据错误。

解决方法:

对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中其他线程不可以参与执行

java对多线程的安全问题提供了解决方法:同步代码块

synchronized(任意对象 )

{

if(tick>0)

{

System.out.println(Thread.currentThread().getName()+"....sale:"+tick--);

}//需要同步的代码

}

还可以使用同步函数

考点:用synchronized修饰函数。同步函数使用的是this

如果同步函数被静态修饰,此时使用的锁是所在的类的字节码文件:类名.class静态方法中不可以定义this

同步的前提:

1,必须要两个以上线程

2,必须多个线程使用同一个锁(对象)。

弊端:多个线程需要判断锁,较为消耗资源。

考点:

懒汉式和饿汉式有什么不同?

懒汉式实例延时加载

延时加载有没有什么问题?

如果多线程访问时会出现问题

出现问题怎么解决?

可以加同步代码块,但是效率会降低,可以采用双层判断提高效率。

加同步使用哪个锁?

该类所属的字节码文件对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值