java多线程简单用法

1、实现多线程-匿名内部类
public class Test{
public static void main(String[] args){
    new Thred(new Runnable(){
      @Override
      public void run(){
        System.out.println("hello word");
      }
    }).start();
  }
}
2、实现多线程-使用lamda
public class Test{
public static void main(String[] args){
new Thred(()->System.out.println("Hello Word!")).start();
}
}
在实际开发过程中,Runnable接口的子类的实现形式可能很少见,以上两种是最为常见的做法。

Runnable中的run方法虽然也是线程的主方法,但是其没有返回值,因为它的设计遵循了主方法的设计原则:线程开始了就别回头。

但是很多时候需要一些返回值,例如:当某些线程执行完成后有可能带来一些结果,这种情况下我们只能利用Callable来拿到返回值。


不管何种情况,要想启动多线程只有Thread类的start()方法
public class Test implements Callable<String>{

@Override
public String call() throws exception{
for(int i=0;i<20;i++){
System.out.println(i);
}
return "票卖完了,下次吧。。。";
}

publlic static void main(String[] args){
FutureTask<String> task = new FutureTask<String>();
new Thred(task).start();
System.out.println(task.get());
}
}

什么是进程?
实际上每当使用了java命令去解释程序的时候,都表示启动了一个新的JVM进程。而主方法知识这个进程上的一个线程而已。
JVM是一个进程,所有的主方法都是一个线程,由主线程创建所有的子线程


线程休眠

主方法只是一个中等优先级


线程死锁:
死锁一旦出现之后实际整个程序就将暂时性中断执行了,所以死锁属于一个严重性的问题,而这个出现的概率不高。
那么在整体的感念理念:数据若果要想完整操作必须使用同步,但是过多的同步会造成死锁,没事干考虑好了再加同步。


请解释sleep和wait的区别?
1、sleep是Tread类中定义的方法,到了一定时间后休眠的线程可以自动唤醒
2、wait()是Object类中定义的方法,如果想要唤醒,必须使用notify()、notifyAll()方法才可以唤醒。
notify() 唤醒第一个等待线程
notifyAll() 唤醒所有等待的线程,哪个优先级高,他就有可能先执行。

原文地址:https://www.cnblogs.com/jiehanshi/p/10779614.html