Packages allow organization of classes and import statements. Package statements declare the package a file belongs to while import statements allow referring to classes from other packages without their fully qualified names. The compiler searches jar files and the classpath to locate classes.
Multithreading allows concurrent execution through threads which are lightweight subtasks that run within a process. Creating a thread can be done by extending Thread class and overriding run() or implementing Runnable interface. Threads make programs scalable and allow asynchronous event-driven programming.
Java I/O uses streams for sequential input/output. Reader/Writer classes provide character-based I/O. File and filter streams provide access to files. Buffered streams improve performance of unbuffered streams