实训之--java多线程
多线程之基础
先来两种实现方式。Thread类 和implement Runnable
1.Thread
//多线程·启动的唯一方法: Thread类中的start()
//线程的主类:继承Thread的类。我认为,多线程的主类在主方法中运行时,和主方法中函数是同级的。
//Thread类有run(),start().
public class TeseThreadDemo1 {
public TeseThreadDemo1() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
// 主线程三?这个for和它们是啥关系?
for(int i=0;i<200;i++) {
System.out.println("这是我主线程要执行的方法");
}
MyThread m1=new MyThread("线程a");//主线程一
MyThread m2=new MyThread("线程b");//主线程二
m1.start();
m2.start();
}
}
//多线程·启动的唯一方法: Thread类中的start()
//线程的主类,Thread类有run(),start().
class MyThread extends Thread{
private String name;
MyThread(String name) {
this.name=name;
}
@Override
public void run() {
for(int i=100;i>0;i--) {
System.out.println(this.name+"->"+i);
}
}
}
优缺点:自然是单继承的局限性。实现比下面较为简单。
2. interface Runnable
//思想:
//runnable接口中有也run(),,实现了接口的主类当然复写run()
//start()只有Threadl类中有,就要考虑,主类去继承Thread类
//碰巧,Thread有个构造方法,Thread(Runnable target)
//那么虽然不是继承,但是作为Thread类中参数的,仍然能调用类中的start()。完美!
package thread;
import java.util.jar.Attributes.Name;
public class TestRunnableDemo1 {
public TestRunnableDemo1() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
MyThread2 m1=new MyThread2("线程a");
MyThread2 m2=new MyThread2("线程b");
new Thread(m1).start();
new Thread(m2).start();
}
}
//线程的主类
class MyThread2 implements Runnable{
private String name;
public MyThread2(String name) {
this.name=name;
}
@Override
public void run() {
for(int x=0;x<200;x++) {
System.out.println(this.name+x);
}
}
}
优缺点:推介的方法。克服单继承。比较复杂。
3。两种方法的比较。
除了他们的优缺点之外,就是:接口更能体现“数据共享”的概念。
为何?在接口中,我们实例化了一个MyThread的对象,但是被多个Thread类作为参数使用,这就能能够共享这一个对象。也就是说,5张票被3个窗口合伙卖完。
当然,Thread也是能实现这样的功能,只是比较不符合常理。new Thread(thrtead).start()。这个意思就好比说俩人都口渴,我的水不喝了,把你的给我何吧。哈哈!
4、同步synchrnized
同步的两种方式:同步代码块,同步方法 。同步特别消耗资源,故推介用代码块,消耗少
说白了就是,一个是把 代码块用方法 包 起来了,一个是把 代码块 用 方法包起来了。多个线程,相互知道对方
为啥用同步?
解决在多线程中,多个线程调用同一个系统资源/类变量,造成的数据不准确问题。说白了比如,a买票,b也买,窗口a看的时候还有一张,突然,控制权被窗口b抢去了,还有一张,卖给b,这时,窗口a把控制权抢回来,刚才还有一张,直接卖了a.冲突。
public class synvhtonixrfxrfzdemo {
public synvhtonixrfxrfzdemo() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
MyThread4 m1=new MyThread4();
new Thread(m1,"线程a").start();
new Thread(m1,"线程b").start();
}
}
class MyThread4 implements Runnable{
private int ticket=5;
@Override
public void run() {
for(int i=0;i<20;i++) {
synchronized (this) {//指该类的类对象
if(this.ticket>0){
System.out.println(Thread.currentThread().getName()+"在卖票"+this.ticket--);
}
}
}
}
}
5.死锁
俩线程都占用对方需要的资源,且缺少对方拥有的资源,互不让步,无限等待。