欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java多線程編程實(shí)現(xiàn)下雪效果

 更新時(shí)間:2015年11月22日 14:45:22   投稿:hebedich  
這篇文章主要介紹了java多線程編程實(shí)現(xiàn)下雪效果的相關(guān)資料,需要的朋友可以參考下

沒有直接采用繼承Thread類或者繼承Runnable的接口來實(shí)現(xiàn)多線程,而是使用了匿名內(nèi)部類。

要導(dǎo)入的類:

 import javax.swing.*;
 import java.awt.*;

1.定義SowPanel類,繼承JPanel類,這個類有兩個整型數(shù)組成員,用來保存雪花起始位置。在構(gòu)造函數(shù)中為數(shù)組賦初值;重寫父類的paint()方法;定義一個啟動多線程的startSnow()方法。

class SnowPanel extends JPanel
{
  //定義整型數(shù)組,存儲雪花坐標(biāo)
  private int[] x=new int[300];
  private int[] y=new int[300];

  public SnowPanel()
  {
    //設(shè)置背景為黑色
    setBackground(Color.black);
    //用隨機(jī)數(shù)初始化雪花坐標(biāo)
    for(int i=0;i<x.length;i++)
    {
      x[i]=(int)(Math.random()*800);
      y[i]=(int)(Math.random()*600);
    }
  }
  
  public void paint(Graphics g)
  {
    //繼承父類畫的方法
    super.paint(g);
    //設(shè)置顏色為白色
    g.setColor(Color.white);
    //利用循環(huán)畫出多個雪花
    for(int i=0;i<x.length;i++)
    {
      g.drawString("*",x[i],y[i]);
    }
  }
  //定義一個方法啟動多線程,并使用匿名內(nèi)部類
  public void startSnow()
  {
    new Thread()
    {
      public void run()
      {
        while(true)
        {
          for(int i=0;i<y.length;i++)
          {
            //坐標(biāo)下移
            y[i]++;
            //檢查是否越界
            if(y[i]==600)
            y[i]=0;
            //重繪
            repaint();
          }
          
           try
           {
            Thread.sleep(10);
           }
             catch (InterruptedException e)
           {
            e.printStackTrace();
           }
        }
      }
    }.start();
  }
}

2.定義ShowFrame類,繼承Jframe 類。在構(gòu)造方法中設(shè)置窗口的顯示屬性,并創(chuàng)建ShowPanel對象,添加到窗口中。

 class SnowPanel extends JPanel
 {
   //定義整型數(shù)組,存儲雪花坐標(biāo)
   private int[] x=new int[300];
   private int[] y=new int[300];
 
   public SnowPanel()
   {
     //設(shè)置背景為黑色
     setBackground(Color.black);
     //用隨機(jī)數(shù)初始化雪花坐標(biāo)
     for(int i=0;i<x.length;i++)
     {
       x[i]=(int)(Math.random()*800);
       y[i]=(int)(Math.random()*600);
     }
   }
   
   public void paint(Graphics g)
   {
     //繼承父類畫的方法
     super.paint(g);
     //設(shè)置顏色為白色
     g.setColor(Color.white);
     //利用循環(huán)畫出多個雪花
     for(int i=0;i<x.length;i++)
     {
       g.drawString("*",x[i],y[i]);
     }
   }
   //定義一個方法啟動多線程,并使用匿名內(nèi)部類
   public void startSnow()
   {
     new Thread()
     {
       public void run()
       {
         while(true)
         {
           for(int i=0;i<y.length;i++)
           {
             //坐標(biāo)下移
             y[i]++;
             //檢查是否越界
             if(y[i]==600)
             y[i]=0;
             //重繪
             repaint();
           }
           
           try
           {
             Thread.sleep(10);
           }
             catch (InterruptedException e)
           {
             e.printStackTrace();
           }
         }
       }
     }.start();
   }
 }

3.運(yùn)行效果圖片(此為靜態(tài)圖):

疑問:發(fā)現(xiàn)其他的不改變,繼承Frame、Panel和繼承JFrame、Jpanel的運(yùn)行效果是不同的,前者顯示的下雪場景總是有閃爍的感覺;后者則沒有閃爍,個人感覺后者效果更好些。

接下來我們來看個例子

這里我們做一個完整的例子來說明線程產(chǎn)生的方式不同而生成的線程的區(qū)別:

package debug;

import java.io.*;
import java.lang.Thread;


class MyThread extends Thread{
 public int x = 0;

 public void run(){
  System.out.println(++x);
 }
}

class R implements Runnable{
 private int x = 0;
 public void run(){
  System.out.println(++x);
 }
}

public class Test {
 public static void main(String[] args) throws Exception{
  
  for(int i=0;i<10;i++){
   Thread t = new MyThread();
   t.start();
  }
  Thread.sleep(10000);//讓上面的線程運(yùn)行完成
  R r = new R();
  for(int i=0;i<10;i++){
   Thread t = new Thread(r);
   t.start();
  }
 }
}

  上面10個線程對象產(chǎn)生的10個線程運(yùn)行時(shí)打印了10次1。下面10個線程對象產(chǎn)生的10個線程運(yùn)行時(shí)打印了1到10。我們把下面的10個線程稱為同一實(shí)例(Runnable實(shí)例)的多個線程。

相關(guān)文章

  • Java中的線程池ThreadPoolExecutor深入解析

    Java中的線程池ThreadPoolExecutor深入解析

    這篇文章主要介紹了Java中的線程池ThreadPoolExecutor深入解析,線程池,thread pool,是一種線程使用模式,線程池維護(hù)著多個線程,等待著監(jiān)督管理者分配可并發(fā)執(zhí)行的任務(wù),需要的朋友可以參考下
    2023-11-11
  • Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法

    Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法

    這篇文章主要介紹了Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-11-11
  • 詳解idea maven項(xiàng)目如何使用lib下得jar包

    詳解idea maven項(xiàng)目如何使用lib下得jar包

    這篇文章主要介紹了詳解idea maven項(xiàng)目如何使用lib下得jar包,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 一篇文章帶你了解JVM內(nèi)存模型

    一篇文章帶你了解JVM內(nèi)存模型

    本文講解了Java 內(nèi)存模型來看看解決可見性、有序性問題的 Java 內(nèi)存模型(JMM),今天通過本文給大家介紹Java 內(nèi)存模型(JVM)的相關(guān)知識,感興趣的朋友一起看看吧
    2021-09-09
  • J2SE與c#的幾點(diǎn)比較

    J2SE與c#的幾點(diǎn)比較

    這篇文章主要介紹了J2SE與c#的幾點(diǎn)比較,是看完馬士兵老師的J2SE視頻教程有感而寫,需要的朋友可以參考下
    2014-08-08
  • mybatis自動填充時(shí)間字段示例代碼

    mybatis自動填充時(shí)間字段示例代碼

    這篇文章主要給大家介紹了關(guān)于mybatis自動填充時(shí)間字段的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • 利用Java實(shí)現(xiàn)mTLS調(diào)用

    利用Java實(shí)現(xiàn)mTLS調(diào)用

    這篇文章主要介紹使用 Java作為客戶端 與受 mTLS 保護(hù)的服務(wù)交互。為了對我們的 Java 客戶端進(jìn)行 ssl 配置,我們需要先設(shè)置一個 SSLContext。這簡化了事情,因?yàn)?SSLContext 可用于各種 http 客戶端,接下來我們一起進(jìn)入下面文章了解具體內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • 詳解elasticsearch實(shí)現(xiàn)基于拼音搜索

    詳解elasticsearch實(shí)現(xiàn)基于拼音搜索

    這篇文章主要為大家介紹了詳解elasticsearch實(shí)現(xiàn)基于拼音搜索示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Spring Boot項(xiàng)目如何同時(shí)支持HTTP和HTTPS協(xié)議的實(shí)現(xiàn)

    Spring Boot項(xiàng)目如何同時(shí)支持HTTP和HTTPS協(xié)議的實(shí)現(xiàn)

    這篇文章主要介紹了Spring Boot項(xiàng)目如何同時(shí)支持HTTP和HTTPS協(xié)議的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • MyBatis-Plus集成Druid環(huán)境搭建的詳細(xì)教程

    MyBatis-Plus集成Druid環(huán)境搭建的詳細(xì)教程

    這篇文章主要介紹了MyBatis-Plus集成Druid環(huán)境搭建的詳細(xì)教程,需要的朋友可以參考下
    2020-08-08

最新評論