线程
来源:互联网 发布:javascript主要用途 编辑:程序博客网 时间:2024/06/04 18:02
转载请注明出处
一.
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才可以执行同步代码块里面的程序。