[Day 12]公費0412-内容整理


🌞マルチスレッド

  • スレッド:実行中のメソッドをスレッドと呼びます.
  • マルチスレッド:
  • プログラミングにより、複数の方法をできるだけ公平に実行できます.
    class Person {
    	String name;
    	
    	public Person(String name) {
    		this.name = name;
    	}
    	
    	public void sayHello() {
    		for(int i=1; i<=10; i++) {
    			System.out.println("Hello" + name + "! " + i);
    		}
     	}
    }
    
    
    public class PersonTest {
    
    	public static void main(String[] args) {
    		Person p1 = new Person("김유신");
    		Person p2 = new Person("홍길동");
    		p1.sayHello();
    		p2.sayHello();
    
    	}
    
    }
    <実行結果>
    Hello김유신! 1
    Hello김유신! 2
    Hello김유신! 3
    Hello김유신! 4
    Hello김유신! 5
    Hello김유신! 6
    Hello김유신! 7
    Hello김유신! 8
    Hello김유신! 9
    Hello김유신! 10
    Hello홍길동! 1
    Hello홍길동! 2
    Hello홍길동! 3
    Hello홍길동! 4
    Hello홍길동! 5
    Hello홍길동! 6
    Hello홍길동! 7
    Hello홍길동! 8
    Hello홍길동! 9
    Hello홍길동! 10
  • メソッドを呼び出し、呼び出しの順序で操作します.
  • p1.sayHello()が終わってからp 2にチャンスを与える
  • 動作p 1のsayhello()に異常が発生して終了すると、p 2は永遠に機会がない可能性がある.
  • では,可能であればp 1とp 2をsayHello()を公平に実行させるためにマルチスレッド方式でプログラミングする.
  • 🌞Javaでのマルチスレッドのプログラミング


  • Threadクラスを継承し、実行方法を公平に実行したい操作に書き換えます.

  • オブジェクトを作成し、公平に動作させることを起動スレッドと呼びます.

  • start()メソッドを呼び出し、できるだけ公平に作業します.

  • Runnableインタフェースを実装するクラスを作成し、runメソッドを多すぎて、公平にするためにいくつかのコマンドを書きます.

  • スレッドを開始するには、Threadオブジェクトとしてパッケージし、start()を呼び出す必要があります.
  • 🌞インタフェースを使用する理由

  • マルチで新しく作成されたクラスは、継承され、マルチスレッドになる必要があります.
  • javaはクラスの複数クラスに属していないため、Runnableインタフェースが使用されます.
  • class MyBall extends JPanel implements Runnable {
    		
    		}

    🌞スレッド優先度の設定

    setPriority(int newPriority)
    	우선순위에 설정할 수 있는 값은 1~10
    	
    	public static final int MAX_PRIORITY	10 			
    	public static final int MIN_PRIORITY	1
    	public static final int NORM_PRIORITY	5
  • 可能であれば、事前に作業を完了することが要求されるが、優先度が高く設定されており、このスレッドが最初に作業を完了するとは限らない.
  • 🌞paintComponent

  • グラフィックを表現するには、JPanelを継承し、グラフィックコンポーネントをレンダリングしすぎてグラフィックを表現することができます.
  • オブジェクトを生成してフレームに入れます.
  • 🌞りんかいいき

  • 2 2 2つ以上のスレッドが任意の変数を共有する場合、2つのスレッドに同時にアクセスすることはできず、1回に1つのスレッドしかアクセスできない領域を「臨界領域」と呼ぶ.
  • Javaでは,臨界領域に近いメソッドの前に同期キーを付ける.
  • 🌞スレッド間通信


  • スレッドを起動すると、できるだけ公平に実行するように手配します.

  • 公平とは限らない.

  • 公平に動作する必要がある場合は、スレッド間で通信が必要です.

  • 相手のテーマが終わるまで、私は「待っています」、「仕事が終わったら、待っている相手のテーマを起こします」.

  • 待機スレッドと起動スレッド間の通信方法を使用します.

  • オブジェクトのwaitメソッドとnotifyメソッドを使用してスレッド間で通信します.
  • 🌈wait()

  • 他のスレッドが作業を完了するのを待つ.
  • 🌈notify()

  • 忙しくなってから他のスレッドを起こします.
  • 🌞例


    🌟(マルチスレッド)例1🌟

    //멀티쓰레드의 필요성
    class Person {
    	String name;
    	
    	public Person(String name) {
    		this.name = name;
    	}
    	
    	public void sayHello() {
    		for(int i=1; i<=10; i++) {
    			System.out.println("Hello" + name + "! " + i);
    		}
     	}
    }
    
    
    public class PersonTest {
    
    	public static void main(String[] args) {
    		Person p1 = new Person("김유신");
    		Person p2 = new Person("홍길동");
    		p1.sayHello();
    		p2.sayHello();
    
    	}
    
    }

    🌟(マルチスレッド)例2🌟

    class Person extends Thread {
    	private String name;
    
    	public Person(String name) {
    		this.name = name;
    	}
    
    	@Override
    	public void run() {
    		for (int i = 1; i <= 10; i++) {
    			System.out.println("Hello, " + name + " " + i);
    
    			try {
    				Thread.sleep(100); // 대기시간을 생성 , 컴퓨터를 0.1초 멈추도록 한다.
    			} catch (Exception e) {
    
    			}
    		}
    	}
    
    }
    
    public class PersonTest {
    
    	public static void main(String[] args) {
    		Person p1 = new Person("홍길동");
    		Person p2 = new Person("이순신");
    		
    //		p1.run(); //일반메소드로 호출하여 p1이 끝나야만 p2를 실행함.
    //		p2.run();
    		
    		p1.start(); //둘이 공평하게 실행할 수 있게 끔 
    		p2.start();
    
    	}
    
    }

    🌟(JPanel)例2🌟

    import java.awt.Color;
    import java.awt.Graphics;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    
    class RedBall extends JPanel {
    
    	@Override
    	protected void paintComponent(Graphics g) {
    		//빨간색으로 색상을 선택
    		g.setColor(Color.red);
    		
    		//채운 원을 그리기.
    		g.fillOval(10, 220, 30, 30);
    	}
    	
    }
    
    
    class MyFrame extends JFrame {
    	
    	RedBall rb;
    	
    	public MyFrame() {
    		rb = new RedBall();
    		add(rb);
    		setSize(400, 300);
    		setVisible(true);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
    }
    
    
    
    public class RedBallTest {
    
    	public static void main(String[] args) {
    		new MyFrame();
    	}
    
    }

    🌞練習問題


    👑練習問題1👑

    import practice01.Count.CountDownEvent;
    
    //pdf 01번문제 (쓰레드연습)
    
    class Count extends Thread {
    	protected int count;
    
    	public Count(int count) {
    		this.count = count;
    
    	}
    
    	@Override
    	public void run() {
    		for (int i = count; i >=1; i--) {
    			System.out.println(i + "초 전입니다.");
    
    			try {
    				Thread.sleep(1000);
    			} catch (Exception e) {
    
    			}
    		}
    		System.out.println("발사 !!!");
    	}
    
    	class CountDownEvent extends Count {
    		private int time;
    		private String msg;
    		public CountDownEvent(int count, int time) {
    			super(count);
    			this.time = time;
    		}
    
    		@Override
    		public void run() {
    			for (int i = 1; i <= 20; i--) {
    				System.out.println(i + "초 전입니다.");
    
    				try {
    					Thread.sleep(100);
    				} catch (Exception e) {
    					System.out.println("대기시간이 지났습니다.");
    				}
    			}
    
    		}
    	}
    }
    
    public class ThreadPractice {
    
    	public static void main(String[] args) {
    		Count c = new Count(20);
    //		CountDownEvent c1 = new CountDownEvent(20, 30, )
    		c.start();
    	}
    
    }