现在的位置: 首页 > 综合 > 正文

线程简析

2019年09月20日 ⁄ 综合 ⁄ 共 1923字 ⁄ 字号 评论关闭

一、java中创建线程的两种方式
   1、继承Thread类,然后重写run(),创建该类对象,并启动;
例:

public class ThreadDemo extends Thread {
	public static void main(String[] args) {
		ThreadDemo td = new ThreadDemo();
		// 开启线程,即另外开启一条通道
		td.start();		
		for (int y = 0; y < 100; y++) {
			System.out.println("main" + y);
		}
	}
	public void run() {
		for (int x = 0; x < 100; x++) {
			System.out.println("run" + x);
		}
	}
}

   2、实现Runnable接口,然后重写run(),再创建该类对象,并作为参数在创建Thread类时传递,并启动。
例:

public class ThreadDemo2 implements Runnable {
	public static void main(String[] args) {
		ThreadDemo2 td = new ThreadDemo2();
		new Thread(td).start();
		for (int x = 0; x < 100; x++) {
			System.out.println("main---" + x);
		}
	}

	@Override
	public void run() {
		for (int x = 0; x < 100; x++) {
			System.out.println("run----------" + x);
		}
	}
}

二、线程的启动与调用run的区别.
 启动:它是开启一个新的线程,然后执行重写的run();
 调用:只是普通的调用run(),依旧还是单线程。

三、关于线程的状态图
 首先,线程有五个状态:创建、就绪、运行、阻塞、结束。下面贴出的是状态图。

四、线程安全问题的产生原因与解决方案.
 1、线程安全问题产生的原因:
     1.多个线程.
     2.多个线程共享数据.
     3.共享的数据被多条语句操作
 2、java关于多线程安全问题解决方法:
    1.synchronized块
   synchronized(任意对象){
    //要锁定代码
   }
   
   注意事项:我们多个线程在操作时,如果要使用锁机制去解决安全问题,就要求必须使用的是同一把锁。
    
    2.synchronized方法.
   即将synchronized做为一个方法的修饰符来对方法进行修饰。
   那么它就是一个同步方法,这时,所使用的锁就this.

  注意:1.在开发中应用同步块更加方便与高效。因为同步方法它的作用域是整个方法内。而我们使用同步块可以对方法中的部分进行锁定。
   
          2.同步方法中使用的锁一定是this吗?
   不一定,如果方法是static,那么我们知道,在static方法内是不能使用this关键字,而是用该对象的字节码文件,即类名.class。
   

五、关于死锁的产生
 死锁一般出现在同步嵌套中。
例:

public class ThreadDemo5 implements Runnable {
	public static void main(String[] args) {
		ThreadDemo5 td = new ThreadDemo5();
		new Thread(td, "first").start();
		new Thread(td, "second").start();
	}

	public void first() {
		new Suo();
		synchronized (Suo.obj1) {
			try {
				Thread.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			new Suo();
			synchronized (Suo.obj2) {
				System.out.println("first");
			}
		}
	}

	public void second() {
		new Suo();
		synchronized (Suo.obj2) {
			new Suo();
			synchronized (Suo.obj1) {
				System.out.println("second");
			}
		}
	}

	@Override
	public void run() {
		if (Thread.currentThread().getName().equals("first")) {
			first();
		} else {
			second();
		}
	}

}

class Suo {
	// 创建2个object对象
	public static final Object obj1 = new Object();
	public static final Object obj2 = new Object();
}

 


【上篇】
【下篇】

抱歉!评论已关闭.