一.
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才可以执行同步代码块里面的程序。