1.进程和线程的区别?
进程是正在执行的应用程序。而线程则是进程中的执行流程,一个进程中可以同时包含多个线程,每个线程也可以得到一小段程序的执行时间。
2.实现线程的主要两种方式:
a.继承java.lang.thread类
b.实现java.lang.Runnable接口
通常情况下,runnable更加实用,因为java无法多继承。
3.继承thread类:
public class ThreadTest extend Thread{
private int count =10;
public void run(){
while (true){
System.out.print(count+" ")}
if(--count ==0){
return;}
}
}
public static void main(String[] args){
new ThreadTest().start();
}
完成线程真正功能的代码放在类的run()方法中,当一个类继承Thread类后,就可以覆盖该类中的run()方法,然后同时调用类中的start()方法执行线程。
4.实现Runnable()接口
public class duoxiancheng extends JFrame{
private Thread t;
private static Color[] color = {Color.BLACK, Color.BLUE,Color.CYAN,
Color.GREEN,Color.ORANGE,Color.YELLOW,Color.RED,
Color.PINK,Color.LIGHT_GRAY};
private static final Random rand = new Random();
private static Color getC(){
return color[rand.nextInt(color.length)];
}
public duoxiancheng(){
t = new Thread(new Runnable(){//第一匿名内部类,该类实现Runnable 接口
int x = 30;
int y = 50;
public void run(){//使用参数为Runnable对象的构造函数方法创建Thread实例
while(true){
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
Graphics graphics = getGraphics();
graphics.setColor(getC());
graphics.drawLine(x, y, 100, y++);
if(y >= 80){
y = 50;
}
}
}
});
t.start();//调用start()方法启动线程
}
public static void main(String[] args){
init(new duoxiancheng(),100,100);
}
使用Runnable接口使用新的线程的步骤如下:
(1)建立Runnable对象
(2)使用参数为Runnable对象的构造函数方法创建Thread实例
(3)调用start()方法启动线程
5.线程的击中可用状态
a.就绪(Runnable):线程准备运行,不一定立马就能开始执行。
b.运行中(Running):进程正在执行线程的代码。
c.等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。(进入等待状态的线程,需要调用Thread类的notify()方法才能将其唤醒。)
d.睡眠中(Sleeping):线程被强制睡眠。
e.i/o阻塞(Blocked on I/O):等待I/O操作完成。
f.死亡(Dead):线程完成了执行。
sleep和wait的区别有: 1,这两个方法来自不同的类分别是Thread和Object 2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得敏感词线程可以使用同步控制块或者方法。 3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在 任何地方使用 synchronized(x){ x.notify() //或者wait() } 4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
下一章会对集合知识点进行回顾