Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

Saturday, August 10, 2019

Java Futures



https://www.nurkiewicz.com/2013/02/listenablefuture-in-guava.html
Technically ListenableFuture extends Future interface by adding simple 

void addListener(Runnable listener, Executor executor)
method. That's it. If you get a hold of ListenableFuture you can register Runnable to be executed immediately when future in question completes. You must also supply Executor (ExecutorServiceextends it) that will be used to execute your listener - so that long-running listeners do not occupy your worker threads.

ListeningExecutorService pool = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));

for (final URL siteUrl : topSites) {
    final ListenableFuture<String> future = pool.submit(new Callable<String>() {
        @Override
        public String call() throws Exception {
            return IOUtils.toString(siteUrl, StandardCharsets.UTF_8);
        }
    });

    future.addListener(new Runnable() {
        @Override
        public void run() {
            try {
                final String contents = future.get();
                //...process web site contents
            } catch (InterruptedException e) {
                log.error("Interrupted", e);
            } catch (ExecutionException e) {
                log.error("Exception in task", e.getCause());
            }
        }
    }, MoreExecutors.sameThreadExecutor());
}
Finally notice MoreExecutors.sameThreadExecutor() being used. It's a handy abstraction which you can use every time some API wants to use an Executor/ExecutorService (presumably thread pool) while you are fine with using current thread. This is especially useful during unit testing - even if your production code uses asynchronous tasks, during tests you can run everything from the same thread. 

Futures.addCallback(future, new FutureCallback<String>() {
    @Override
    public void onSuccess(String contents) {
        //...process web site contents
    }

    @Override
    public void onFailure(Throwable throwable) {
        log.error("Exception in task", throwable);
    }
});
FutureCallback is a much simpler abstraction to work with, resolves future and does exception handling for you. Also you can still supply custom thread pool for listeners if you want. If you are stuck with some legacy API that still returns Future you may try JdkFutureAdapters.listenInPoolThread() which is an adapter converting plain Future<V> to ListenableFuture<V>. But keep in mind that once you start using addListener(), each such adapter will require one thread exclusively to work so this solution doesn't scale at all and you should avoid it.


Future<String> future = //...
ListenableFuture<String> listenableFuture =
        JdkFutureAdapters.listenInPoolThread(future);

http://codingjunkie.net/google-guava-concurrency-listenablefuture/
https://www.jesperdj.com/2015/09/21/listen-to-the-future-with-google-guava/

https://stackoverflow.com/questions/38744943/listenablefuture-vs-completablefuture
In other words... ListenableFuture is a well thought out clean interface, while CompletableFuture (and the CompletionStage interface since it exposes toCompletableFuture) is dangerous because it exposes complete methods. Yet another example of the not-very-well-thought-out garbage that we've come to expect from Oracle.

With CompletableFuture you can also register a callback for when the task is complete, but it is different from ListenableFuture in that it can be completed from any thread that wants it to complete.
CompletableFuture completableFuture = new CompletableFuture();
    completableFuture.whenComplete(new BiConsumer() {
        @Override
        public void accept(Object o, Object o2) {
            //handle complete
        }
    }); // complete the task
    completableFuture.complete(new Object())
When a thread calls complete on the task, the value received from a call to get() is set with the parameter value if the task is not already completed.






Difference between Array and Collection



https://www.quora.com/What-is-the-difference-between-Array-and-Collections-in-Java%E2%80%8B
  1. Arrays are fixed in size but Collections are dynamic in size.
https://www.sitesbay.com/collection-framework/collection-framework-advantage
  • Collection is re-sizable or dynamically draw-able memory.
  • Provides useful data structures in the form of predefined classes that reduces programming affords.
  • It support to store heterogeneous elements or object.
  • It provides higher performance.
  • It provides Extendability (depends on incoming flow of data,if the size of collection framework variable is increasing than the collection framework variable is containing Extendability feature).
  • It provides adaptability facility( The process of adding the content of one collection framework variable to another collection framework either in the beginning or in the ending or in the middle in known as adaptability).
  • It is one of the algorithmic oriented.
  • It provides in-built sorting technique.
  • It provides in-built searching technique.
  • It provides higher preliminary concepts of Data Structure such as:- Stack,Queue,LinkedList,Trees ..etc.

Difference between Array and Collection

ArrayCollection
1Arrays are fixed in size and hence once we created an array we are not allowed to increase or decrease the size based on our requirement.Collections are grow-able in nature and hence based on our requirement we can increase or decrease the size.
2Arrays can hold both primitives as well as objects.Collections can hold only objects but not primitive.
3Performance point of view arrays faster than collectionPerformance point of view collections are slower than array
4Arrays can hold only homogeneous elements.Collections can hold both homogeneous and heterogeneous elements.
5Memory point of view arrays are not recommended to use.Memory point of view collections are recommended to use.
6For any requirement, there is no ready method available.For every requirement ready made 

http://www.informit.com/articles/article.aspx?p=2861454&seqNum=3

Tuesday, July 30, 2019

IntelliJ IDEA settings



https://stackoverflow.com/questions/11053144/how-to-see-javadoc-in-intellij-idea
Go to File/SettingsEditor, click on General. Scroll down, then ✔ Show quick documentation on mouse move.

File size exceeds configured limit (2560000), code insight features not available
https://stackoverflow.com/questions/23057988/file-size-exceeds-configured-limit-2560000-code-insight-features-not-availabl/37124550
This is built from Álvaro González's answer and How to increase IDE memory limit in IntelliJ IDEA on Mac?
Go to Help > Edit Custom Properties
Add:
idea.max.intellisense.filesize=999999
Restart the IDE.

https://intellij-support.jetbrains.com/hc/en-us/articles/206544869-Configuring-JVM-options-and-platform-properties
# Maximum file size (kilobytes) IDE should provide code assistance for.
# The larger file is the slower its editor works and higher overall system memory requirements are
# if code assistance is enabled. Remove this property or set to very large number if you need
# code assistance for any files available regardless their size.
#---------------------------------------------------------------------
idea.max.intellisense.filesize=2500

#---------------------------------------------------------------------
# This option controls console cyclic buffer: keeps the console output size not higher than the specified buffer size (Kb)
# Older lines are deleted. In order to disable cycle buffer use idea.cycle.buffer.size=disabled
#---------------------------------------------------------------------
idea.cycle.buffer.size=1024

https://intellij-support.jetbrains.com/hc/en-us/community/posts/206204729-Middle-mouse-click-for-navigation-versus-Ubuntu-X11
You should go to your keymap settings (ide settings | keymap) and do the following:
  1. Remove 'Button2' mouse shortcut from 'Paste from X clipboard' action;
  2. Add 'Button2' mouse shortcut for 'main menu | navigate | declaration' action;
https://darekkay.com/blog/intellij-idea-settings/
Sometimes you don’t even need to open the settings dialog. Press Ctrl + Shift + Aand type the setting name. If it’s a checkbox option, you can press Return to toggle the setting - effective immediately!

Finally, some settings are only applied to the current project, e.g. the JavaScript language level. To customize default project settings, go to File → Other Settings → Default settings....
Zoom with the mouse wheel
☑ Editor → General → Change font size (zoom) with Ctrl+Mouse Wheel

That’s a feature known from most other text editors and browsers, but it’s disabled by default. Enable this option to zoom using Ctrl + Mouse Wheel.

Show line numbers on the editor gutter
☑ Editor → General → Appearance → Show line numbers

That’s self explanatory. Additionally, press Ctrl + G to navigate to a line number.

Wrap long lines
☑ Editor > General > Use soft wraps in editor
☑ Editor > General > (Console >) Use soft wraps in console
Editor > General > Use custom soft wraps indent/additional shift: 1

mprove tab appearance
☑ Editor → General → Editor Tabs → Hide file extension in editor tabs
☐ Editor → General → Editor Tabs → Show “close” button on editor tabs

By hiding both file extensions and close icons you will gain a lot of free space in the editor tab panel. File icons are enough to infer the file types, and you are still able to close tabs by pressing the middle mouse key or Ctrl + F4.

use Ctrl + E to switch between recent files and Ctrl + Shift + E to switch between recently edited files. I’m currently trying out this idea (no pun intended), but it’s quite hard to quit the habit of using tabs.

Sort debugger fields alphabetically
☑ Build, Execution, Deployment → Debugger → Data Views → Sort alphabetically

By default, debugger variables are listed in the order in which they were defined. I find this makes it harder to find the right values.

Bonus tip: you can focus any list/tree panel (like debugger variables or the project view) and search for a value by simply starting to type. If multiple values match the search string, use ↓ and ↑ keys to step through them.
In this example I typed mo, so I can toggle the selection between module and mongoose:

Remove unused sidebar panels
That’s a new feature in IntelliJ IDEA 15. Finally we are able to remove unwanted tool window buttons. Just right click a sidebar button and select Remove from sidebar. You can restore a hidden tool window with View → Tool Windows.

Remove sidebar panel
Remove sidebar panel
Use a custom terminal shell
☑ Tools → Terminal → Shell path

IDEA comes with a handy terminal panel (Alt + F12). However, using the default Windows command prompt can sometimes be quite annoying. Fortunatelly, you can use a more useful shell within IntelliJ IDEA, like the Git Bash (by default under C:\Program Files\Git in ash.exe).

You can customize the terminal font and colors here:

☑ Editor → Colors & Fonts → Console Font/Colors




Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts