zoukankan      html  css  js  c++  java
  • Java多线程编程一

    线程的基本概念

    线程:是一个程序里面不同的执行路径。

    Java中的线程是通过Thread类来实现的,每一个Thread类对象代表一个新的线程。

    1. 通过创建Thread的实例来创建新的线程
    2. 每个线程通过每个特定Thread对象所对应的方法run()来完成其操作,也就是说将要执行的代码写在run()内,run方法称为线程体。
    3. 通过调用Thread类的start()方法来启动一个线程。
     1 //通过继承Thread类来创建线程。Thread本身就继承了Runnable接口
     2 public class TestThread1{
     3     public static void main(String args[]){
     4         Runner1  r = new Runner1();
     5         r.start();
     6         for(int i=0; i<100; i++){
     7             System.out.println(" Main ---" + i);
     8          }
     9      }
    10 }
    11 class Runner1 extends Threads{
    12     public void run(){
    13 
    14        for(int i=0; i<100; i++){
    15             System.out.println(" Runner1 ---" + i);
    16          }
    17     }
    18 }

    第二个实现线程的方法是实现Runnable接口。

     1 //通过实现Runnable接口来创建线程
     2 public class TestThread1{
     3     public static void main(String args[]){
     4         Runner1  r = new Runner1();
     5         Thread t = new Thread(r);
     6         t.start();
     7         for(int i=0; i<100; i++){
     8             System.out.println(" Main ---" + i);
     9          }
    10      }
    11 }
    12 class Runner1 implements Runnable{
    13     public void run(){
    14     for(int i=0; i<100; i++){
    15             System.out.println(" Runner1 ---" + i);
    16          }
    17     }
    18 }

          经常需要使类在其自身线程中执行代码,但如果该类继承自Thread类,那么就不能继承其他类的功能,因为java不支持多重继承。与实现Runnable接口相比,Thread类的继承并无功能优势,这两种办法的难度也相当,因此经常将实现Runnable接口作为首选方法。

          更简单的方法是定义实现Runnable接口的匿名内类:

     1 package com;
     2 import java.awt.*;
     3 import java.awt.event.*;
     4 import javax.swing.*;
     5 public class ButtonPress extends JFrame {
     6 
     7     public static void main(String[] args){
     8         ButtonPress bp = new ButtonPress();
     9         bp.setSize(400, 300);
    10         bp.setVisible(true);
    11     }
    12     
    13     public ButtonPress(){
    14         JMenuBar jmb = new JMenuBar();
    15         JMenu menu = new JMenu("Execute");
    16         jmb.add(menu);
    17         JMenuItem jmi = new JMenuItem("Database Query");
    18         menu.add(jmi);
    19         jmi.addActionListener(new ActionListener(){
    20             public void actionPerformed(ActionEvent event){
    21                 Thread t = new Thread(new Runnable(){
    22                     public void run(){
    23                         performDatabaseQuery();
    24                     }
    25                 });
    26                 t.start();
    27             }
    28         });
    29         setJMenuBar(jmb);
    30     }
    31     protected void performDatabaseQuery(){
    32         try{
    33             Thread.sleep(5000);
    34         }catch (Exception e){
    35             
    36         }
    37         ;
    38     }
    39 }

    线程控制基本方法
    方法功能
    isAlive() 判断线程是否活着,即线程是否还未终止
    getPriority() 获得线程的优先级数值
    setPriority() 设置线程的优先级数值
    Thread.sleap() 将当前线程睡眠指定毫秒数
    join() 调用某线程的该方法,将当前线程与该线程“合并”,即等待该线程结束,在恢复当前线程的运行
    yield() 让出cpu,当前线程进入就绪队列等待调度
    wait() 当前线程进入对象的wait pool
    notify()/notifyAll() 唤醒对象的wait pool中的一个/所有等待线程


  • 相关阅读:
    xshell 使用命令上传、下载文件
    linux extglob模式 和rm反选,除了某个文件外的其他文件全部删除的命令
    vscode
    win10文件夹共享
    jquery-自适应全屏背景轮播动画
    jquery-抖动图组轮播动画
    jquery-leonaScroll-1.2-自定义滚动条插件
    jquery-leonaScroll-1.1-自定义滚动条插件
    JavaScript-JQ实现自定义滚动条插件1.0
    JavaScript-JQ初探实现自定义滚动条
  • 原文地址:https://www.cnblogs.com/freeabyss/p/3187052.html
Copyright © 2011-2022 走看看