-
线程是进程的进一步划分,一个进程代表的是一个程序,一个程序可以运行多个子程序,这些子程序就叫线程
- 在同一段时间内比传统过的进程完成的功能多
- 指的是在同一个时间段内有多个程序在执行,但在一个时间点上只有一个程序
- 一个类只要extends thread则即实现了多线程
d2.run() ;
d3.run() ;
}
};
- 修改下,查阅jdk可以看到线程要启动是调用 start()
d2.start() ;
d3.start() ;
}
};
- 要是一个类只能继承thread来实现线程,但java中只能继承一个类,因此java又提供了接口Runnable这也可以实现多线程
- 看到Runnable只有一个run()方法,但是Runnable没有提供调用的方法
- 查找文档thread可以看到一个构造方法,
public Thread(Runnable target)
可以看到这样即可调用
t2.start() ;
t3.start() ;
}
};
- 建议使用runnable这个是接口,看到thread 其实也是实现了这个接口
- 实现了runnable的接口操作的共享的资源
- 如:卖火车票这个,共有10张票,开4个线程来卖,如继承thread来实现,则一共卖了40张这是不可能的,而用runnalbe则合理
- Runnable 适合多个相干同程序代码去处理统一资源的情况。
- 得到当前线程的方法
public static Thread currentThread()可以看到这个方法是静态的 既可以直接通过类名来访问即:Thread.currentThread()
- 通过getName可以得到当前线程的名字,同样setName可以改名字,及同时可以用构造方法Thread(Runnable target, String name) 这样可以为线程定名字,而且最好线程的名字最好刚开始就给设定
- main方法也是一个线程,
{
d.fun() ;//通过main方法调用的线程是main线程,和t1同时进行
}
}
};
- 线程方法,只能启动一次
线程启动方法,start(),iaAlive()测试线程是否启动和仍然启动
t1.isAlive()) ;
//因为main方法和是线程和t1交替运行,则t1肯定有被延迟的时候
}
};
- isAlive()方法,此方法在线程之后判断,结果没有固定的内容,因为线程有可能优先执行完,有可能最后执行完。
- sleep()方法,public static void sleep(long millis) throws InterruptedException,看到也是静态方法(毫秒)
- 看到必须用try catch 扑捉
- 线程的强制运行,public final void join(long millis)
throws InterruptedException强制此线程运行完后,别的线程才可以运行
i) ;
//System.打印方法是main线程方法和t交替进行,但是当i=10时必须运行完t1后再执行main方法的打印
}
}
};
- 线程的中断方法
public void interrupt()方法
}
};
- 查看线程是否中断的操作方法 public static boolean interrupted()
- 线程的不同步问题,即延迟造成的。如:
t1.start() ;
t2.start() ;
t3.start() ;
}
};
- 同步操作方法既是用synchronized关键字,表示此方法为同步方法
1 普通代码块 直接写在方法中的
}
};
}
};
3 静态块 用static关键字括起来的代码块,只执行一次,静态块又要优先构造块执行
}
};
t1.start() ;
t2.start() ;
t3.start() ;
}
};
- 可见同步可用 两种方法 来完成
1 同步方法
2同步代码块
但是同步会产生死锁的问题;
- 死锁就是在多线程编程中,由于处理不当,造成程序停止运行状态
- 线程的通信 同步的经典案例,就是生产者--->消费者
线程的通信问题:一个线程向数据存储空间加入数据(生产者),另一个线程从数据存储空间取出数据(消费者)
1 假设生产者线程刚向数据存储空间加入一个人的姓名,还没有加入性别,但是消费者就将其取走和上一个人的性别联系起来了
2 生产者放入了若干个数据消费者才开始消费,或者消费者取出数据后还没有等生产者在放入数据就把以前的又取走了 重复取出
}
};