黑马程序员_线程总结

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

/*java VM 在启动的时候会有一个进程java.exe。
该进程至少有一个线程负责java程序的执行。
而且这个线程运行的代码在于main方法中。
该线程称之为主线程。


扩展:其实更细节说明jvm,jvm不止一个线程,还有负责垃圾回收机制的线程。

创建线程的第一种方法;
1.创建一个Thread类的子类;
2.重写Thread类的run()方法;
将自定义的代码存储在run方法中。让线程运行。
3.调用线程的start()方法;该方法两个作用:启动线程,调用run方法。
start()开启线程,并执行run()方法。直接调用对象.run()方法,仅仅是对象调用方法。线程创建了,但是没有运行。

发现运行结果每一次不同。因为cpu分配的原因。

线程都有自己默认的名称,为Thread-编号,编号从零开始。
局部变量在每个线程中都有一份存在。*/

/*创建线程的第二种方式:
1.定义类实现Runnable接口。
2.覆盖Runnable接口中的run方法。
 将线程要运行的代码存放在该run方法中。
3.通过Thread类建立线程对象。
4.将Runnable接口的子类对象作为实际参数。
    自定义的run方法所属的对象是Runnable接口的子类对象。
 所以要让线程去指定指定对象的run方法。就必须明确该run方法所属对象。
5.调用Thread的start方法开启线程比调用run方法。

实现方式与继承方式的区别;

实现方式的好处;避免单继承的局限性。
在定义线程时,建议使用该方式。、

继承Thread:线程代码在Thread子类的run方法中。
实现Runnable:线程代码在实现接口的run方法中。

synchronized(对象)
{
需要被同步的代码块
}
对象如同锁,持有锁的线程可以在同步中执行。
没有锁的线程即使获得cpu的执行权,也进不去,因为没有获取锁。

同步的前提;
必须有两个或者两个以上的线程,且使用同一个锁。

同步解决了线程的安全问题,但是消耗了资源,降低了程序执行的效率。

同步函数需要被对象所调用。那么函数都有一个所属的对象引用。就是this。
所以同步函数所使用的锁就是this.

如果同步函数被静态修饰呢。
静态进内存,内存中没有对象,但是一定有该类对应的字节码文件对象。
类名.class 该对象的类型是Class
所以使用的锁就是该方法所在类对应的字节码文件的对象.  类名.Class.


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

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值