----------- 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学习型技术博客、期待与您交流! ------------