二十、Java线程方法、声明周期、锁

1.线程中常用的方法

1.static Thread currentThread()得到当前正在运行的线程对象

2.void start() 启动线程

3.String getName()返回该线程的名称。

(1)当没有设置线程名称的时候,系统会赋予线程一个默认的名称“Thread-0,Thread-1......”

(2) 主线程【主方法的执行线程】的名称默认是“main”

4.void setName(String name)设置线程名称

例子:

public class FreadMthods {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyThread n = new MyThread();
		Thread thread1 = new Thread(n);
		Thread thread2 = new Thread(n);
		
		//主线程
		String mainname =  Thread.currentThread().getName();
		System.out.println(mainname + "主线程名字");  //主线程的名字默认为main
		
		//改变线程的名字:
		//1. 通过献策很难过对象进行设置
		thread1.setName("线程1");
		thread2.setName("线程2");
		//2. 在创建线程对象的时候第二个参数为线程的名字
		Thread thread3 = new Thread(n,"线程3");
		Thread thread4 = new Thread(n,"线程4");
		thread1.start();
		thread2.start();
		thread4.start();
		thread3.start();
	}
}

class MyThread implements Runnable{
	@Override
	public void run() {
		// 常用方法
		// currentThread()得到当前正在运行的线程对象
		//通过getName()返回该线程的名称
		//当没有设置线程名称的时候,系统会赋予线程一个默认的名字 Thread-n
		//主线程默认名字是main
		Thread thisobj = Thread.currentThread();
		String thname = thisobj.getName();
		int i = 0;
		while(true){
			i++;
			System.out.println(thname + " i + " + i);  //默认名字Thread-1 / Thread-2
			if (i>50) {
				break;
			}
			
		}
		
	}
}

5.线程的优先级

就是线程的执行先后概率,默认优先级都是5

void setPriority(int newPriority) 更改线程的优先级。

  1. 线程的优先级有10级,分别是整数1~10来表示。数字越高优先级越高。
  2. 为了方便操作,java将10个级别有规定成3个级别,分别为在于低级:1 中级:5 高级: 10

        static int MAX_PRIORITY 线程可以具有的最高优先级。10

        static int MIN_PRIORITY线程可以具有的最低优先级。1

        static int NORM_PRIORITY分配给线程的默认优先级。5

package com20211120;

public class ThreadPriorityTest {
	
	//设置优先级
	public static void main(String[] args) {
 	 MyThreadTest1 fn =	new MyThreadTest1();
 	 Thread th1 = new Thread(fn,"线程1");
 	 Thread th2 = new Thread(fn, "线程2");
 	 Thread th3 = new Thread(fn,"线程3");
 	 //1.通过1-10整数设置优先级
 	 th1.setPriority(10);
 	 th2.setPriority(5);
 	 th3.setPriority(1);
 	 //2.通过Thread提供的静态常量来设置优先级
 	 th1.setPriority(Thread.MIN_PRIORITY); //优先级最低  为1
 	 th2.setPriority(Thread.NORM_PRIORITY);//优先级中等  为5
 	 th3.setPriority(Thread.MAX_PRIORITY); //优先级最高  为10
 	 th1.start();
 	 th2.start();
 	 th3.start(); 
 	 
 	 System.out.println(th1.getName()+"优先级数" + th1.getPriority());
 	 System.out.println(th2.getName() +"优先级数" + th2.getPriority());
 	 System.out.println(th3.getName() +"优先级数" + th3.getPriority());
	}
}

class MyThreadTest1 implements Runnable{
	@Override
	public void run() {
		//默认执行代码
		int i = 1;
		while(true){
			if (i > 50) {
				break;
			}
			String name = Thread.currentThread().getName();
			System.out.println(name + " i  = " + i++);
		}
	}
}

int getPriority() 返回线程的优先级。

 //2.通过Thread提供的静态常量来设置优先级
   th1.setPriority(Thread.MIN_PRIORITY); //优先级最低  为1
   th2.setPriority(Thread.NORM_PRIORITY);//优先级中等  为5
   th3.setPriority(Thread.MAX_PRIORITY); //优先级最高  为10
   th1.start();
   th2.start();
   th3.start();
    System.out.println(th1.getName()+"优先级数" + th1.getPriority());
    System.out.println(th2.getName() +"优先级数" + th2.getPriority());
    System.out.println(th3.getName() +"优先级数" + th3.getPriority());

设置线程的优先级的时候,数字越大优先级越高,数字越小优先级越低。优先级越高并代表就一定会优先执行,只是被优先执行的几率增大,因此不要试图通过控制线程的优先级,来保证某一个线程,总是第一个执行。

6 守护线程的相关操作方法

(1)用户线程:通常情况之下我们所创建的线程都是普通线程,非守护线程,也叫用户线程。

(2)守护线程:也叫精灵线程,当所有用户线程都执行完毕以后,自动结束运行的线程就是守护线程.[共死]

1.boolean isDaemon() 测试该线程是否为守护线程。

2.void setDaemon(boolean on) 将该线程标记为守护线程用户线程。

特征:当所有用户线程都执行完毕以后,无论守护线程能否可以继续运行,都要立刻停止运行。

例子:

package com20211120;

public class ThreadDeamonTest {

	public static void main(String[] args) {
		// 线程守护
		MyThreadTest myth = new MyThreadTest();
		Thread th1 = new Thread(myth);
		Thread th2 = new Thread(myth);
		Thread th3 = new Thread(){
			@SuppressWarnings("static-access")
			public void run(){
				while(true){
					try {
						this.sleep(1);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println("我是守护线程");
				}
			}
		};
		th3.setDaemon(true);
		th1.start();
		th2.start();
		
		th3.start();
	}
}
class  MyThreadTest implements Runnable{

	@Override
	public void run() {
		//默认执行代码
				int i = 1;
				while(true){
					if (i > 50) {
						break;
					}
					String name = Thread.currentThread().getName();
					System.out.println(name + " i  = " + i++);
				}
		}
}

7static void sleep(long millis) 设置线程休眠【暂停】指定的时间【毫秒】

  1. void interrupt() 中断线程休眠【暂停】。会进入异常【InterruptedException】。
  2. void join(long millis)【强制线程执行】等待该线程终止的时间最长为 millis 毫秒。
public class ThreadSleepTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyThreadTest3 my3 = new MyThreadTest3();
		Thread fn = new Thread(my3,"小明");
		System.out.println("开始上课");
		fn.start();
		try {
			Thread.sleep(4000);
			fn.interrupt();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("没叫醒");
		}
	}
}

class MyThreadTest3 implements Runnable {
	@Override
	public void run() {
		// 上课后
		Thread atthis = Thread.currentThread();
		String name = atthis.getName();
		System.out.println(name + "上课2s开始睡觉");
		try {
			Thread.sleep(2000);
			System.out.println(name + "睡着了");
			atthis.join();
		} catch (InterruptedException e) {
			System.out.println(name + "被叫醒来了");
		}
		System.out.println(name + "继续上课");
	}
}

2.线程的生命周期

1) 线程的声明周期就是线程的从一开始创建,到run方法执行完毕以后的状态变化。【状态之间的切换】。

2)线程的声明周期几种状态【1、新建状态2、就绪状态、3.运行状态、4、阻塞状态、5死亡状态】

线程的声明周期描述

1.新建状态:通过new的方式创建出来的线程对象,此时线程正处于创建状态【新建状态】

* 新建状态的线程不能运行。

* 先将状态的线程调用start方法进入就绪状态。

2.就绪状态:线程具备运行能力,只差操作系统【CUP】分配给他运行时间片

* 得到操作系统【CUP】分配给他运行的时间片,此时开始运行run方法,进入运行状态。

3.运行状态:线程运行run方法

* 回到就绪状态:

1)操作系统【cpu】分配给他运行时间片使用完毕,回到就绪状态

* 进入阻塞状态:

  1. 运行抓状态的线程执行了sleep方法,进入阻塞状态。
  2. 运行状态的线程执行了wait方法,进入阻塞状态。
  3. 运行状态的线程执行输入/输出,进入阻塞状态。

.....等等。

* 进入死亡状态

1)运行状态的线程run方法执行完毕,进入死亡状态。

2)运行状态的线程对象调用了stop()/destory(),进入死亡状态。

4. 阻塞状态:线程暂停运行

*回到运行状态

阻塞状态的线程,结束了造成阻塞的原因,此时线程进入就绪状态,得到操作系统「CPU」分配给他们的运行时间片就可以进入运行状态。

运行状态进入阻塞状态的原因:

1)运行状态的线程执行了sleep方法,进入阻塞状态,休眠时间结束/interrup,进入就绪状态。

2)运行状态的线程执行了wait方法,进入阻塞状态,调用notify/notifyAll,进入就绪状态

3)运行状态的线程执行输入/输出动作,进入阻塞状态,输入/输出结束,进入就绪状态。

5.死亡状态:线程运行结束,释放运行资源。

死亡状态的线程是不能运行的,除非线程对象再次调用start()方法重新启动运行。

图例:

3.线程安全/线程同步

1)为什么我们要学习线程同步/线程安全

线程同步也叫线程安全。当多条线程,同时访问同一个资源的时候,每一次只能由多条线程中的一条访问公共资源,当这一条线程访问公共资源的时候,其他的线程处于等待状态,不能呢个访问公共资源,剩下的线程继续等待,等待当前线程访问结束,实现这个过程叫做线程同步。[排队访问资源]

2)实现方式

(1)Synchronized关键字 [同步代码快/同步方法]

**同步代码块

格式:synchronized(同步对象){

}

package com20211120;

public class SynchronizedTest {

	public static void main(String[] args) {
		ThreadTest  srctarget = new ThreadTest();
		Thread thread = new Thread(srctarget,"窗口1");
		Thread thread2 = new Thread(srctarget,"窗口2");
		Thread thread3 = new Thread(srctarget,"窗口3");
		thread.setPriority(1);
		thread3.setPriority(Thread.MAX_PRIORITY);
		thread.start();
		thread2.start();
		thread3.start();

	}

}

class ThreadTest implements Runnable{
	private int count = 0;//统计执行的次数

	private int piao = 500;
	@Override
	
	public void run() {
		Thread thread = Thread.currentThread();
		String name = thread.getName();
		while (true) {
		synchronized (this) {
			if (piao <= 0) {
				return;
			}
			System.out.println(name + "卖出一张票,剩余" + (--piao) +"张");
			count++;
			}
			System.out.println("买了" + count+"次票");
		}
	}
}

注意:如果不写同步对象可能会锁住整个类。

(2)同步方法

原因:同步代码块虽然可以实现效果,但是他在使用的时候,需要设置同步对象,由于我们很多时候不知道同步对象是谁,容易写错,造成思锁。因为这个缺点,我们很少使用同步代码块来实现同步线程。

同步方法个定义格式:

访问限制修饰符 synchronized 方法返回值类型 方法名称(){}

package com20211120;

	public class SynchronizedMethodTest {

		public static void main(String[] args) {
			ThreadTest2  srctarget = new ThreadTest2();
			Thread thread = new Thread(srctarget,"窗口1");
			Thread thread2 = new Thread(srctarget,"窗口2");
			Thread thread3 = new Thread(srctarget,"窗口3");
			thread.setPriority(1);
			thread3.setPriority(Thread.MAX_PRIORITY);
			thread.start();
			thread2.start();
			thread3.start();

		}

	}

	class ThreadTest2 implements Runnable{
		private int count = 0;//统计执行的次数
		private int piao = 500;
		public synchronized boolean fns(String name){
			if (piao <=0 ) {
				return false;
			}
			System.out.println(name + "卖出一张票,剩余" + (--piao) +"张");
			count++;
			System.out.println("买了" + count+"次票");
			return true;
		}
		@Override
		public void run() {
			Thread thread = Thread.currentThread();
			String name = thread.getName();
			boolean flag =true;
			while (flag) {
				flag =	fns(name);
			}
		}
	}

(3)通过Lock接口

public interface Lock

常用方法

void lock()获得锁

void unlock()释放锁

由于上面的锁方法是Lock接口,我们要使用就得先创建出Lock接口对象,由于Lock是个接口不能new,我们就得使用它的子类创建对象。

Lock接口的子类ReentrantLock类

例子:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LockTest {

	public static void main(String[] args) {
		ThreadTest4  srctarget = new ThreadTest4();
		Thread thread = new Thread(srctarget,"窗口1");
		Thread thread2 = new Thread(srctarget,"窗口2");
		Thread thread3 = new Thread(srctarget,"窗口3");
		thread.setPriority(1);
		thread3.setPriority(Thread.MAX_PRIORITY);
		thread.start();
		thread2.start();
		thread3.start();
	}

	
}
class ThreadTest4 implements Runnable{
	
	private int count = 0;
	private int piao = 100;
	@Override
	public void run() {
		Thread thread = Thread.currentThread();
		String name = thread.getName();
		Lock fLock = new ReentrantLock();
		while (true) {
			fLock.lock();
			if (piao <= 0) {
				return;
			}
			System.out.println(name + "卖出一张票,剩余" + (--piao) +"张");
			count++;
			fLock.unlock();
			System.out.println("买了" + count + "次票");
			}
		}
	}

Synchronized关键字与lock的区别

synchronized

Lock

关键字

接口

自动锁定资源,不灵活

手动锁定资源灵活

异常时会自动释放锁

异常时不会自动释放锁

所以需要finally实现释放锁

不能中断锁,必须等待线程执行完成释放锁

可以中断锁

无奈源于不够强大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2章:简单Java程序】_简单Java程序笔记.pdf 010301_【第3章:Java基础程序设计】_Java数据类型笔记.pdf 010302_【第3章:Java基础程序设计】_运算符、表达式与语句笔记.pdf 010303_【第3章:Java基础程序设计】_判断与循环语句笔记.pdf 010401_【第4章:数组与方法】_数组的定义及使用笔记.pdf 010402_【第4章:数组与方法】_方法声明及使用笔记.pdf 010403_【第4章:数组与方法】_数组的引用传递笔记.pdf 010404_【第4章:数组与方法】_Java新特性对数组的支持笔记.pdf 020501_【第5章:面向对象基础】_面向对象、类与对象的定义笔记.pdf 020502_【第5章:面向对象基础】_类与对象的进一步研究笔记.pdf 020503_【第5章:面向对象基础】_封装性笔记.pdf 020504_【第5章:面向对象基础】_构造方法与匿名对象笔记.pdf 020505_〖第5章:面向对象基础〗_实例讲解—类设计分析(学生类)笔记.pdf 020506_【第5章:面向对象基础】_String类笔记.pdf 020507_【第5章:面向对象基础】_String类的常用方法.pdf 020508_【第5章:面向对象基础】_引用传递及其应用笔记.pdf 020509_【第5章:面向对象基础】_this关键字笔记.pdf 020510_【第5章:面向对象基础】_static关键字笔记.pdf 020511_【第5章:面向对象基础】_理解main方法笔记.pdf 020512_【第5章:面向对象基础】_代码块笔记.pdf 020513_【第5章:面向对象基础】_构造方法私有化笔记.pdf 020514_【第5章:面向对象基础】_对象数组笔记.pdf 020515_【第5章:面向对象基础】_内部类笔记.pdf 020516_〖第5章:面向对象基础〗_实例讲解—系统登陆笔记.pdf 020517_〖第5章:面向对象基础〗_实例讲解—单向链表(1)笔记.pdf 020518_〖第5章:面向对象基础〗_实例讲解—单向链表(2)笔记.pdf 020601_【第6章:面向对象(高级)】_继承的基本实现笔记.pdf 020602_【第6章:面向对象(高级)】_继承的进一步研究笔记.pdf 020603_〖第6章:面向对象(高级)〗_范例:继承的应用笔记.pdf 020604_【第6章:面向对象(高级)】_final关键字笔记.pdf 020605_【第6章:面向对象(高级)】_抽象类的基本概念笔记.pdf 020606_【第6章:面向对象(高级)】_接口的基本概念笔记.pdf 020607_【第6章:面向对象(高级)】_对象的多态性笔记.pdf 020608_【第6章:面向对象(高级)】_instanceof关键字笔记.pdf 020609_【第6章:面向对象(高级)】_抽象类与接口的应用笔记.pdf 020610_〖第6章:面向对象(高级)〗_实例分析:宠物商店笔记.pdf 020611_【第6章:面向对象(高级)】_Object类笔记.pdf 020612_【第6章:面向对象(高级)】_包装类笔记.pdf 020613_【第6章:面向对象(高级)】_匿名内部类笔记.pdf 020701_【第7章:异常的基本概念】_异常的基本概念笔记.pdf 020702_【第7章:异常的基本概念】_异常的其他概念笔记.pdf 020801_【第8章:包及访问控制权限】_包的定义及导入笔记.pdf 020802_【第8章:包及访问控制权限】_访问控制权限及命名规范笔记.pdf 030901_【第9章:多线程】_认识多线程笔记.pdf 030902_【第9章:多线程】_线程常用操作方法笔记.pdf 030903_〖第9章:多线程〗_线程操作范例笔记.pdf 030904_【第9章:多线程】_同步与死笔记.pdf 030905_【第9章:多线程】_线程操作案例——生产者和消费者笔记.pdf 030906_【第9章:多线程】_线程生命周期笔记.pdf 031001_【第10章:泛型】_泛型入门笔记.pdf 031002_【第10章:泛型】_通配符笔记.pdf 031003_【第10章:泛型】_泛型的其他应用笔记.pdf 031004_〖第10章:泛型〗_实例讲解—泛型操作范例笔记.pdf 031101_【第11章:Java常用类库】_StringBuffer笔记.pdf 031102_【第11章:Java常用类库】_Runtime类笔记.pdf 031103_【第11章:Java常用类库】_国际化程序笔记.pdf 031104_【第11章:Java常用类库】_System类笔记.pdf 031105_【第11章:Java常用类库】_日期操作类(Date、Calendar)笔记.pdf 031106_【第11章:Java常用类库】_日期操作类(DateFormat、SimpleDateFormat)笔记.pdf 031107_〖第11章:Java常用类库〗_实例操作:取得当前日期笔记.pdf 031108_【第11章:Java常用类库】_Math与Random类笔记.pdf 031109_【第11章:Java常用类库】_NumberFormat笔记.pdf 031110_【第11章:Java常用类库】_大数操作(BigIntger、BigDecimal)笔记.pdf 031111_【第11章:Java常用类库】_对象克隆技术笔记.pdf 031112_【第11章:Java常用类库】_Arrays笔记.pdf 031113_【第11章:Java常用类库】_比较器(Comparable、Comparator)笔记.pdf 031114_【第11章:Java常用类库】_观察者设计模式笔记.pdf 031115_【第11章:Java常用类库】_正则表达式笔记.pdf 031116_【第11章:Java常用类库】_定时调度笔记.pdf 031201_【第12章:JAVA IO】_File类笔记.pdf 031202_【第12章:JAVA IO】_RandomAccessFile笔记.pdf 031203_【第12章:JAVA IO】_字节流与字符流笔记.pdf 031204_【第12章:JAVA IO】_字节-字符转换流笔记.pdf 031205_【第12章:JAVA IO】_内存操作流笔记.pdf 031206_【第12章:JAVA IO】_管道流笔记.pdf 031207_【第12章:JAVA IO】_打印流笔记.pdf 031208_【第12章:JAVA IO】_System类对IO的支持笔记.pdf 031209_【第12章:JAVA IO】_BufferedReader笔记.pdf 031210_〖第12章:JAVA IO〗_IO操作实例笔记.pdf 031211_【第12章:JAVA IO】_Scanner笔记.pdf 031212_【第12章:JAVA IO】_数据操作流笔记.pdf 031213_【第12章:JAVA IO】_合并流笔记.pdf 031214_【第12章:JAVA IO】_压缩流笔记.pdf 031215_【第12章:JAVA IO】_回退流笔记.pdf 031216_【第12章:JAVA IO】_字符编码笔记.pdf 031217_【第12章:JAVA IO】_对象序列化笔记.pdf 031218_〖第12章:JAVA IO〗_实例操作—单人信息管理程序笔记.pdf 031219_〖第12章:JAVA IO〗_实例操作:投票程序笔记.pdf 031301_【第13章:Java类集】_认识类集、Collection接口笔记.pdf 031302_【第13章:Java类集】_List接口笔记.pdf 031303_【第13章:Java类集】_LinkedList类笔记.pdf 031304_【第13章:Java类集】_Set接口笔记.pdf 031305_【第13章:Java类集】_排序及重复元素说明笔记.pdf 031306_【第13章:Java类集】_SortedSet接口笔记.pdf 031307_【第13章:Java类集】_Iterator接口笔记.pdf 031308_【第13章:Java类集】_ListIterator接口笔记.pdf 031309_【第13章:Java类集】_foreach及Enumeration接口笔记.pdf 031310_【第13章:Java类集】_Map接口笔记.pdf 031311_【第13章:Java类集】_Map接口使用的注意事项笔记.pdf 031312_【第13章:Java类集】_IdentityHashMap类笔记.pdf 031313_【第13章:Java类集】_SortedMap类笔记.pdf 031314_【第13章:Java类集】_集合工具类:Collections笔记.pdf 031315_【第13章:Java类集】_Stack类笔记.pdf 031316_【第13章:Java类集】_属性类:Properties笔记.pdf 031317_〖第13章:Java类集〗_范例讲解:一对多关系笔记.pdf 031318_〖第13章:Java类集〗_范例讲解:多对多关系笔记.pdf 031401_【第14章:枚举】_枚举的作用笔记.pdf 031402_【第14章:枚举】_Enum笔记.pdf 031403_【第14章:枚举】_类集对Enum的支持笔记.pdf 031404_【第14章:枚举】_枚举的其他应用笔记.pdf 031501_【第15章:Java反射机制】_认识Class类笔记.pdf 031502_【第15章:Java反射机制】_Class类的使用笔记.pdf 031503_【第15章:Java反射机制】_反射应用——取得类的结构笔记.pdf 031504_【第15章:Java反射机制】_Java反射机制的深入研究笔记.pdf 031505_【第15章:Java反射机制】_动态代理笔记.pdf 031506_【第15章:Java反射机制】_工厂设计模式笔记.pdf 031601_【第16章:Annotation】_系统内建Annotation笔记.pdf 031602_【第16章:Annotation】_自定义Annotation笔记.pdf 031603_【第16章:Annotation】_反射与Annotation笔记.pdf 031604_【第16章:Annotation】_深入Annotation笔记.pdf 031701_【第17章:Java数据库编程】_JDBC概述笔记.pdf 031702_【第17章:Java数据库编程】_MySQL数据库笔记.pdf 031703_【第17章:Java数据库编程】_SQL语法基础笔记.pdf 031704_【第17章:Java数据库编程】_JDBC操作步骤及数据库连接操作笔记.pdf 031705_【第17章:Java数据库编程】_执行数据库更新操作笔记.pdf 031706_【第17章:Java数据库编程】_ResultSet接口笔记.pdf 031707_【第17章:Java数据库编程】_PreparedStatement接口笔记.pdf 031708_【第17章:Java数据库编程】_处理大数据对象(1)—处理CLOB数据笔记.pdf 031709_【第17章:Java数据库编程】_处理大数据对象(2)—处理BLOB数据笔记.pdf 031710_【第17章:Java数据库编程】_CallableStatement接口笔记.pdf 031711_【第17章:Java数据库编程】_JDBC 2.0操作笔记.pdf 031712_【第17章:Java数据库编程】_事务处理笔记.pdf 031713_【第17章:Java数据库编程】_使用元数据分析数据库笔记.pdf 031714_【第17章:Java数据库编程】_使用JDBC连接Oracle笔记.pdf 031801_【第18章:图形界面】_AWT、Swing简介笔记.pdf 031802_【第18章:图形界面】_基本容器:JFrame笔记.pdf 031803_【第18章:图形界面】_标签组件:JLabel笔记.pdf 031804_【第18章:图形界面】_按钮组件:JButton笔记.pdf 031805_【第18章:图形界面】_布局管理器笔记.pdf 031806_【第18章:图形界面】_其他容器笔记.pdf 031807_【第18章:图形界面】_不弹起的按钮组件:JToggleButton笔记.pdf 031808_【第18章:图形界面】_文本组件:JTextComponent笔记.pdf 031809_【第18章:图形界面】_事件处理笔记.pdf 031810_【第18章:图形界面】_单选钮:JRadioButton笔记.pdf 031811_【第18章:图形界面】_复选框:JCheckBox笔记.pdf 031812_【第18章:图形界面】_列表框:JList笔记.pdf 031812_【第18章:图形界面】_下拉列表框:JComboBox笔记.pdf 031813_【第18章:图形界面】_菜单组件笔记.pdf 031814_【第18章:图形界面】_文件选择框笔记.pdf 031815_【第18章:图形界面】_表格笔记.pdf 031901_【第19章:Java网络编程】_IP(Internet Protocol)与InetAddress笔记.pdf 031902_【第19章:Java网络编程】_URL与URLConnection笔记.pdf 031903_【第19章:Java网络编程】_URLEncoder与URLDecoder笔记.pdf 031904_【第19章:Java网络编程】_TCP程序设计笔记.pdf 031905_【第19章:Java网络编程】_UDP程序设计笔记.pdf 032001_【第20章:Java新IO】_缓冲区与Buffer笔记.pdf 032002_【第20章:Java新IO】_通道(Channel)笔记.pdf 032003_【第20章:Java新IO】_文件笔记.pdf 032004_【第20章:Java新IO】_字符集笔记.pdf 032005_【第20章:Java新IO】_Selector笔记.pdf 042101_【课程讲解】_附录:Eclipse开发工具笔记.pdf 050101_〖开发实例〗_Java开发实例讲解(人员管理)笔记.pdf

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值