一、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(); }