Java线程与多线程

什么是进程?什么是线程?

        进程是:一个应用程序(1个进程是一个软件)。

        线程是:一个进程中的执行场景/执行单元。

        注意:一个进程可以启动多个线程

进程和线程是什么关系?

        进程:可以看做是现实生活当中的公司。         

        线程:可以看做是公司当中的某个员工。

        注意:进程A和进程B的 内存独立不共享

线程A和线程B是什么关系?

        在java语言中:线程A和线程B,堆内存 和 方法区 内存共享。但是 栈内存 独立,一个线程一个栈。

eg.假设启动10个线程,会有10个栈空间,每个栈和每个栈之间,互不干扰,各自执行各自的,这就是多线程并发。

eg.
        火车站,可以看做是一个进程。
        火车站中的每一个售票窗口可以看做是一个线程。
        我在窗口1购票,你可以在窗口2购票,你不需要等我,我也不需要等你。所以多线程并发可以提高效率。

        由于线程可以独立完成自己的任务,这样一来,程序便可以实现更加丰富的功能,这也是设计游戏时需要掌握的技能。

怎么创建线程

        编写一个类,直接 继承 java.lang.Thread重写 run方法

        创建线程对象 —— new继承线程的类。

        启动线程 —— 调用线程对象的 start() 方法。

关于线程的sleep方法

方法名 : static void sleep(long millis)     作用  : 让当前线程休眠millis秒       参数是 毫秒

        作用: 让当前线程进入休眠,进入“阻塞状态”,放弃占有CPU时间片,让给其它线程使用。
                这行代码出现在A线程中,A线程就会进入休眠。
                这行代码出现在B线程中,B线程就会进入休眠。
        Thread.sleep()方法,可以做到这种效果:间隔特定的时间,去执行一段特定的代码,每隔多久执行一次。

 // 睡眠1秒
            try   {
                           Thread.sleep(1000);
                     } catch (InterruptedException e) {
                           e.printStackTrace();
                     }

        java内部有Thread类,我们为其创建一个对象便是一个线程。假设我在做飞机大战这个线程游戏。我们这里只介绍框架的搭建,不具体谈方法体。首先,我创建了一个ThreadDraw 类继承Thread类,然后重写run方法,写了一个for循环模拟飞机大战中射击的子弹。然后加上延时,这样我们就可以控制程序执行的频率了,此时需要抛出异常。

public class ThreadDraw extends Thread {
    private Graphics g;
    private int count = 10;
    public ThreadDraw(Graphics g, int count) {
        this.g=g;
        this.count= count;
    }

    public void run(){
        int x=20;int y = 100;
        for (int i=0;i<250;i++){
            g.setColor(Color.red);
            g.fillOval(x+count,y+i,10,10);

            try {
                Thread.sleep(30);//2ghz , 3ghz
            }catch (Exception ef){}
            //覆盖背景
            g.setColor(Color.BLACK);
            g.fillRect(0,100,500,600);
        }
    }
}

        有了线程的类,我们只有为其创建具体的对象才能够实现这个线程。于是我们在想创建线程的地方为其申明一个对象。然后在方法内创建并启动这个线程。注意,我们用到的是start()方法来启动这个线程。

public void actionPerformed(ActionEvent e) {
    //1.创建一个线程类的对象
    count += 40;
    ThreadDraw td = new ThreadDraw(g,count);
    //2.启动这个线程对象
    td.start();
    System.out.println("已经启动一个线程对象去画了");
}

        然后程序便会不断执行run()方法的内容了。你可以在run方法内写任意你想执行的内容。

多线程的实现

        多线程的实现方法即创建多个类继承Thread类,然后分别在其中重写run()方法,然后创建类的对象,并start即可。这样一来就可以多个线程同时运行了。

线程 同步锁

        在多线程的运行过程中可能也会遇到一些问题,比如线程的同步问题。各个线程看似彼此独立,但其实他们是轮流使用cpu的资源,线程的同步就是协同步调,按预定的先后次序进行运行。

        如果没有线程的同步,如果一个线程过长,可能会出现方法没有执行完就被别的线程抢占资源这类情况。所以为了线程的同步,我们需要加上同步锁,这里我们介绍一种最方便实现的同步锁synchronized。

        我们只要在方法的public后加上synchronized即可,这可以确保次方法执行完之后才会把cpu资源让给别的线程。

例如:public synchronized void gameRun(){ }。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值