java多线程 基础回顾

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不需要捕获异常

下一章会对集合知识点进行回顾


猜你喜欢

转载自blog.csdn.net/puzimengya/article/details/80248107